言語環境に依存しない日付型への変換方法は?

解決


ひな  2004-11-19 09:09:01  No: 86755  IP: [192.*.*.*]

VB6.0を使って集計ソフトの開発をしています。
DataValue関数を用いて文字列を日付に変換しているのですが、
OSの言語環境により、日本と海外の日付の表示方法が違うため、
変換結果がおかしくなります。
例    04-11-19     JAPAN   2004/11/19
                   ENGLISH 04/11/2019
何か良い方法はないでしょうか?
いろいろな言語環境に対応したいので、
できれば言語環境に依存しない関数があればよいのですが。
なお、環境はWindowsXPを使用しています。
よろしくお願いします。

編集 削除
nanashi  2004-11-19 10:07:44  No: 86756  IP: [192.*.*.*]

Format$(Date, "yyyy/mm/dd")

とかじゃダメですか?

編集 削除
魔界の仮面弁士  2004-11-19 10:34:41  No: 86757  IP: [192.*.*.*]

nanashiさん、惜しい!

"/"の文字もコントロールパネルの影響を受けますので、この場合は
  S = Format(Date(), "yyyy\/mm\/dd")
のように、/の前に\をつけてエスケープする必要があります。

たとえば地域の設定で、区切り文字が"-"になっていると、
nanashiさんの構文では 2004-11-19 になりますが、
"\/"を付けておけば、"2004/11/19" として出力させることが出来ます。

編集 削除
ひな  2004-11-19 10:38:08  No: 86758  IP: [192.*.*.*]

nanashiさんありがとうございました。
結局、yyの部分をyyyyの形式にして
無理やり年と認識させることで解決しました。
少し不安な気もしますが・・・。
Formatも使ってみたのですが、年の部分に
おかしな値が入ってしまいました。
謎です。でもたぶんこれは私のプログラムミスですね(笑)

編集 削除
魔界の仮面弁士  2004-11-19 11:10:17  No: 86759  IP: [192.*.*.*]

> 例    04-11-19     JAPAN   2004/11/19
>                    ENGLISH 04/11/2019

あ、失礼。日付型→文字列型ではなく、文字列型→日付型ですね。

文字列の書式が "yy-mm-dd" 形式であるならば、
  S = "04-11-09"
  W = Split(S, "-")
  D = DateSerial(CInt(W(0)), CInt(W(1)), CInt(W(2)))
で如何でしょう?

編集 削除
ひな  2004-11-19 11:39:05  No: 86760  IP: [192.*.*.*]

nanashiさんと魔界の仮面弁士さんのアドバイスが気になり、
解決策に一抹の不安もあったので試してみたのですが、
format関数を使うとなぜか0はシステムの影響を受けるのか
おかしな値になります。
例  s = Format(Date, "2004\/11\/19")だと
    sの値は  238310/11/19  になります。
0がどうやら問題のようなので、試しに0を\でエスケープしてみたら
正常に値が入りました。
これってなぜでしょうか???

編集 削除
nanashi  2004-11-19 11:52:15  No: 86761  IP: [192.*.*.*]

>魔界の仮面弁士さん

フォローありがとうございます。
そんなエスケープが必要とは知りませんでした(^^;

>ひなさん

> s = Format(Date, "2004\/11\/19")

違います。
それをしたいなら

s = Format$("2004/11/19", "yyyy\/mm\/dd")

です。

編集 削除
ひな  2004-11-19 12:00:48  No: 86762  IP: [192.*.*.*]

なるほど、根本的な間違いですね(笑)
魔界の仮面弁士さんの方法で再び解決しました。
nanashiさん、魔界の仮面弁士さん、ありがとうございました!!

編集 削除
魔界の仮面弁士  2004-11-19 15:12:20  No: 86763  IP: [192.*.*.*]

》 nanashiさん
> そんなエスケープが必要とは知りませんでした(^^;
ついでに、このあたりも。

[文字列からDate型への変換に注意する]
http://www.gj.il24.net/~nakasima/vb/trap/index.htm#VBTRAP19


》 ひなさん
> 例  s = Format(Date, "2004\/11\/19")だと
>     sの値は  238310/11/19  になります。
ついでに、上記の間違いコードの動作についても解説を。


1. Format関数は、第1引数に指定された値を、第2引数の書式で変換する関数です。
  この場合、数値指定書式文字(0)が最初に現れたため、第一引数が数値として
  認識されます。

2. Date関数の戻り値は日付型ですが、内部的には1899/12/30からの経過日数を
  表したDouble型の値となっています。例えば本日(2004/11/19)の場合、
  「CDbl(Date())」は「38310.000」になります。

3. 今回の指定では、s = "2" & Format(Date, "00") & "4/11/19" の
  意味になります。結果として、『238310/11/19』が出力されます。


数値指定書式、文字列指定書式、日付指定書式の違いについては、
ヘルプで Format 関数の関連項目を参照してください。

=======
Debug.Print Format(Now(), "0000000.0000 yyyy mm dd")
Debug.Print Format(Now(), "yyyy mm dd 0000000.0000")
=======
この場合、前者は「0038310.〜〜 yyyy mm dd」となりますが、
後者の場合には、「2004 11 19 0000000.0000」となります。



ついでに書くと、"/" を "\/" とエスケープする必要があるのは、
yyyy や mm などの「日付指定書式文字」を利用している場合です。

s = Format(Date, "2004\/11\/19") の場合は、「数値指定書式」なので、
s = Format(Date, "2004/11/19") と書いても、同じ結果になります。

編集 削除