Now関数で時刻が取得できない

解決


たく  2012-01-17 14:50:49  No: 103199  IP: [192.*.*.*]

VB6
OS NTまたはXP

Nowwo使用してファイルに書き込んだものが日付だけとなってしまいます。
→WriteLine(Now)

上記にあるように特に分割して時刻を消しているということはしていないのですが、このようなことはありえますでしょうか?
OSで設定できますか?

自分でOSの設定を変更したりして試してみましたがNowは日付+時刻を取得します。

何か方法があれば教えてください。
よろしくお願いします。

編集 削除
魔界の仮面弁士  2012-01-17 15:33:17  No: 103200  IP: [192.*.*.*]

> Nowwo使用してファイルに書き込んだものが日付だけとなってしまいます。
> →WriteLine(Now)
ここでいう WriteLine とは、FileSystemObject 等で使われる
TextStream オブジェクトの WriteLine メソッドのことでしょうか?
(VB6 には WriteLine というステートメントはありません)


> 上記にあるように特に分割して時刻を消しているということはしていないのですが、
ファイルはテキストファイルですか?
だとしたら、Now すなわち日付型の値を文字列型にする際に、
書式指定はどのように行っていますか? (Format 関数など)

書式指定しなかった場合、その書式は OS の地域設定依存となると予想しますが、
和暦か西暦か、月日年の順か年月日の順か、日付区切りは「-」なのか「/」なのか、
時刻部はAM/PM表記なのか24H表記なのか、ひと桁時刻は "01" 表記か "1" 表記か
などの情報が、ユーザーのコントロールパネル設定によって変動するという
分かりにくい不具合を埋め込んでしまうことになります。


> このようなことはありえますでしょうか?
たとえば、時刻部が正子(深夜12時)ちょうどだった場合、
Now と Date は同じ値となります。

この場合、日付型を文字列化する際に書式指定していなかった場合や、
FormatDateTime 関数で vbGeneralDate を指定していた場合には、
時刻部が表示されないことになるでしょうね。

編集 削除
たく  2012-01-17 16:50:18  No: 103201  IP: [192.*.*.*]

> TextStream オブジェクトの WriteLine メソッドのことでしょうか?
そうです。

ファイルはテキストファイルで、書式指定は特に行っていません。
またNowは変換をしていません。そのまま(Now & その他文字列)として書き込んでいます。
→このため、正午ちょうどのときに書式設定していないため今回の現象が出ていると考えるのがいいのでしょうか。

編集 削除
魔界の仮面弁士  2012-01-17 17:45:23  No: 103202  IP: [192.*.*.*]

> またNowは変換をしていません。
まず、その点を見直すべきだと思いますよ。

たとえば「Debug.Print Now」を実行した場合でいえば、
OSの「コントロールパネル」の地域と言語の設定で、
http://www.vb-user.net/junk/replySamples/2012.01.17.17.35/JpEra.png
のように日付書式を変更していた場合、出力結果は
"2012/01/17 17:25:47" の形式ではなく、
"H24-01-17 17:25:47" の形式で出力されます。

地域設定というのものは、ユーザーが自由に変更できる場所です。
(官公庁系や保険会社など、和暦系を好む業種の人もいます)

ですからデータの入出力を伴う場所では、Format 関数を使うなどして、
数値や日付の書式を『常に』明示することを強くおすすめします。
(表示だけの項目ならば、OS 設定依存でも構わないと思いますが)

たとえば「Debug.Print Format(Now, "yyyy\/MM\/dd HH\:mm\:ss")」ならば、
上記画像の地域設定にしていた場合でも "2012/01/17 17:25:47" に
なりますし、
時刻部が無かった場合も、"2012/01/17 00:00:00" と出力されます。
(書式中の \ を忘れないように注意…)

編集 削除
たく  2012-01-18 08:39:25  No: 103203  IP: [192.*.*.*]

魔界の仮面弁士さん

原因わかりました。
魔界の仮面弁士さんの言っている通り、0:00:00ぴったりのときにDateと同じになり、時刻が消えていました。
これが悪さしていました。

勉強になりました、アドバイスありがとうございます。

編集 削除
魔界の仮面弁士  2012-01-18 09:36:39  No: 103204  IP: [192.*.*.*]

>> 時刻部が正子(深夜12時)ちょうどだった場合、
> →このため、正午ちょうどのときに書式設定していないため
正午ではなく正子ですね。

00:00:00 の場合(日付型の内部値が整数値の場合)は日付のみとなり、
00:00:01〜23:59:59 (内部値が小数部を持つ場合)は日付+時刻で表示されます。


> 今回の現象が出ていると考えるのがいいのでしょうか。
ということだったようですね。

なお、今回のような日付→文字列への書式指定なしの自動変換結果については、
日付値が 1899/12/30 00:00:00〜1899/12/30 23:59:59 の範囲にあった場合に限り、
「日付のみ」や「日付+時刻」ではなく、「時刻のみ」の文字列となります。蛇足までに。
(今回は Now の利用なので、1899/12/30 の事はあまり気にしなくても良いですが)


> これが悪さしていました。
日付型の値を文字列化するときだけでなく、
数値型の値を文字列化するときにも、書式指定をお忘れなく。

編集 削除