VB6.0を使って集計ソフトの開発をしています。
DataValue関数を用いて文字列を日付に変換しているのですが、
OSの言語環境により、日本と海外の日付の表示方法が違うため、
変換結果がおかしくなります。
例 04-11-19 JAPAN 2004/11/19
ENGLISH 04/11/2019
何か良い方法はないでしょうか?
いろいろな言語環境に対応したいので、
できれば言語環境に依存しない関数があればよいのですが。
なお、環境はWindowsXPを使用しています。
よろしくお願いします。
Format$(Date, "yyyy/mm/dd")
とかじゃダメですか?
nanashiさん、惜しい!
"/"の文字もコントロールパネルの影響を受けますので、この場合は
S = Format(Date(), "yyyy\/mm\/dd")
のように、/の前に\をつけてエスケープする必要があります。
たとえば地域の設定で、区切り文字が"-"になっていると、
nanashiさんの構文では 2004-11-19 になりますが、
"\/"を付けておけば、"2004/11/19" として出力させることが出来ます。
nanashiさんありがとうございました。
結局、yyの部分をyyyyの形式にして
無理やり年と認識させることで解決しました。
少し不安な気もしますが・・・。
Formatも使ってみたのですが、年の部分に
おかしな値が入ってしまいました。
謎です。でもたぶんこれは私のプログラムミスですね(笑)
> 例 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)))
で如何でしょう?
nanashiさんと魔界の仮面弁士さんのアドバイスが気になり、
解決策に一抹の不安もあったので試してみたのですが、
format関数を使うとなぜか0はシステムの影響を受けるのか
おかしな値になります。
例 s = Format(Date, "2004\/11\/19")だと
sの値は 238310/11/19 になります。
0がどうやら問題のようなので、試しに0を\でエスケープしてみたら
正常に値が入りました。
これってなぜでしょうか???
>魔界の仮面弁士さん
フォローありがとうございます。
そんなエスケープが必要とは知りませんでした(^^;
>ひなさん
> s = Format(Date, "2004\/11\/19")
違います。
それをしたいなら
s = Format$("2004/11/19", "yyyy\/mm\/dd")
です。
なるほど、根本的な間違いですね(笑)
魔界の仮面弁士さんの方法で再び解決しました。
nanashiさん、魔界の仮面弁士さん、ありがとうございました!!
》 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") と書いても、同じ結果になります。