C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[5]: 日付の比較の仕方をおしえてください!


(過去ログ 66 を表示中)

[トピック内 7 記事 (1 - 7 表示)]  << 0 >>

■38722 / inTopicNo.1)  日付の比較の仕方をおしえてください!
  
□投稿者/ Yoco (8回)-(2009/07/23(Thu) 17:10:43)

分類:[VB.NET/VB2005 以降] 

たびたびお世話になります。

「yyyyMMddHHmmss」の文字列を日付型に変換し、日付の比較をしたいと思っています。

現在、
Dim dtYmdhms_A As Date = Date.ParseExact("20090610203839", "yyyyMMddHHmmss", CultureInfo.InvariantCulture)
Dim dtYmdhms_B As Date = Date.ParseExact("20090610110838", "yyyyMMddHHmmss", CultureInfo.InvariantCulture)

DateDiff(DateInterval.Minute, dtYmdhms_A, dtYmdhms_B)

と書いているのですが、日付型に変換した際に24時間表記にならず想定外の結果になってしまいます。

dtYmdhms_A の結果:#6/10/2009 8:38:39 PM#
dtYmdhms_B の結果:#6/10/2009 11:38:39 AM#

→日付比較の結果は、dtYmdhms_A の方が最新であるのにもかかわらず、dtYmdhms_B の方が最新として処理されてしまう。

単に "20090610203839" と "20090610110838" では、どちらが最新か(大きい数字か)ということを知りたいのですが
他により良い方法がありますでしょうか?

説明不足な点は、お手数ですがご指摘ください。。。

宜しくご教授お願いいたします。

【環境】
WindowsXP SP2、VB2500

引用返信 編集キー/
■38723 / inTopicNo.2)  Re[1]: 日付の比較の仕方をおしえてください!
□投稿者/ よねKEN (386回)-(2009/07/23(Thu) 17:24:25)
2009/07/23(Thu) 17:30:32 編集(投稿者)
2009/07/23(Thu) 17:25:13 編集(投稿者)

No38722 (Yoco さん) に返信
> →日付比較の結果は、dtYmdhms_A の方が最新であるのにもかかわらず、dtYmdhms_B の方が最新として処理されてしまう。

どのように判断しているのかが記載されていませんが、
おそらくDateDiff関数の戻り値の意味を取り違っているのだと思います。

DateDiff関数
http://msdn.microsoft.com/ja-jp/library/b5xbyt6f.aspx

> DateDiff(DateInterval.Minute, dtYmdhms_A, dtYmdhms_B)
という場合、A < B の場合にDateDiffは正の値を返します。A > Bの場合に負の値です。
逆で判断していませんか?


> 単に "20090610203839" と "20090610110838" では、どちらが最新か(大きい数字か)ということを知りたいのですが
> 他により良い方法がありますでしょうか?

↓Aの方がBより大きいかを判断する方法です。
(1) DateDiff(DateInterval.Minute, dtYmdhms_A, dtYmdhms_B) < 0
(2) dtYmdhms_A > dtYmdhms_B
(3) "20090610203839" > "20090610110838" ※yyyyMMddHHmmss形式の文字列が保しょうできる場合

引用返信 編集キー/
■38724 / inTopicNo.3)  Re[2]: 日付の比較の仕方をおしえてください!
□投稿者/ みきぬ (556回)-(2009/07/23(Thu) 17:27:55)
>>単に "20090610203839" と "20090610110838" では、どちらが最新か(大きい数字か)ということを知りたいのですが
>>他により良い方法がありますでしょうか?
>
そのまま DateDiff を使ってもいいですが、.NET 的には Date.Compare(dtYmdhms_A, dtYmdhms_B) か dtYmdhms_A.CompareTo(dtYmdhms_B) かなあ。
引用返信 編集キー/
■38728 / inTopicNo.4)  Re[3]: 日付の比較の仕方をおしえてください!
□投稿者/ Yoco (9回)-(2009/07/23(Thu) 18:13:13)
よねKEN さん、みきぬ さん

たびたびお付き合いくださいまして感謝いたします。

データが "yyyyMMddHHmmss" 形式の文字列で保障されている仕様であることから
一番簡単な(私にでも理解可能な(汗)…)「(3) "20090610203839" > "20090610110838"」を使うことにしました☆

.NETは、文字列でも > が使用できるのですね。。。
(Javaの人間なので考えもしませんでした…。反省。)

ちなみに
>どのように判断しているのかが記載されていませんが

Dim dtYmdhms_A As Date = Date.ParseExact("20090610203839", "yyyyMMddHHmmss", CultureInfo.InvariantCulture)
Dim dtYmdhms_B As Date = Date.ParseExact("20090610110838", "yyyyMMddHHmmss", CultureInfo.InvariantCulture)

Dim lRet As Long = DateDiff(DateInterval.Minute, dtYmdhms_A, dtYmdhms_B)

If lRet > 0 Then
'処理
End If

と書いておりました。

If文の中に入らない事を想定していたのですが、分岐に入ってしまいました。。。
うーん...


みきぬ さんにご教授いただいた「Date.Compare(dtYmdhms_A, dtYmdhms_B) か dtYmdhms_A.CompareTo(dtYmdhms_B) 」もカッコイイので、
時間のある時に試してみたいと思います!!

お二方、本当にありがとうございました!


解決済み
引用返信 編集キー/
■38732 / inTopicNo.5)  Re[4]: 日付の比較の仕方をおしえてください!
□投稿者/ 魔界の仮面弁士 (1159回)-(2009/07/23(Thu) 22:24:58)
2009/07/24(Fri) 09:02:13 編集(投稿者)

No38728 (Yoco さん) に返信
> .NETは、文字列でも > が使用できるのですね。。。
> (Javaの人間なので考えもしませんでした…。反省。)
それはちょっと違います。.NET の仕様では無く、VB の仕様です。
.NET の String に「=」や「≠」は実装されていますが、「>」の演算子は実装されていません。

たとえば C# では、「"20090610203839" > "20090610110838"」はコンパイルエラー CS0019
『演算子 '>' を 'string' と 'string' 型のオペランドに適用することはできません。』
を引き起こす事になります。
(C# で大小比較する場合、String.CompareOrdinal や String.Compare メソッドを使う事になります)


ちなみに VB の場合、文字列同士でも > の演算子が使えるようになっていますが、
その結果は Option Compare の設定に依存する事に注意してください。Text モードの場合、
全角/半角、大文字/小文字、ひらがな/カタカナが同一視されることになります。
(VB で文字列比較した場合、コンパイル時に StrComp 関数相当の呼び出しに置き換えられています)

> Dim dtYmdhms_A As Date = Date.ParseExact("20090610203839", "yyyyMMddHHmmss", CultureInfo.InvariantCulture)
> Dim dtYmdhms_B As Date = Date.ParseExact("20090610110838", "yyyyMMddHHmmss", CultureInfo.InvariantCulture)
既に回答が付いていますが、Date 型の比較であれば、
 If dtYmdhms_A < dtYmdhms_B Then
で十分ですよ。


> Dim lRet As Long = DateDiff(DateInterval.Minute, dtYmdhms_A, dtYmdhms_B)
> If lRet > 0 Then
このコードは、
 Dim d As Double = (dtYmdhms_B - dtYmdhms_A).TotalMinutes
 If d < 0.0r Then
の意味になります。

DataDiff(単位, A, B)の結果が正数を返すのは、A < B となる場合です。

『A から B を引いた時刻の差』(つまり、A - B)ではなく、
『A から B までの時間の長さ』(つまり、B - A)に相当する結果を返します。
解決済み
引用返信 編集キー/
■38738 / inTopicNo.6)  Re[4]: 日付の比較の仕方をおしえてください!
□投稿者/ よねKEN (387回)-(2009/07/24(Fri) 00:03:43)
> と書いておりました。
>
> If文の中に入らない事を想定していたのですが、分岐に入ってしまいました。。。
> うーん...

No38723 の私のコメントで、
>> DateDiff(DateInterval.Minute, dtYmdhms_A, dtYmdhms_B)
>という場合、A < B の場合にDateDiffは正の値を返します。A > Bの場合に負の値です。
>逆で判断していませんか?

と指摘している通りなのですが、うまく伝わってないように見えるので、補足しておきます。

> ちなみに
> >どのように判断しているのかが記載されていませんが
>
> Dim dtYmdhms_A As Date = Date.ParseExact("20090610203839", "yyyyMMddHHmmss", CultureInfo.InvariantCulture)
> Dim dtYmdhms_B As Date = Date.ParseExact("20090610110838", "yyyyMMddHHmmss", CultureInfo.InvariantCulture)
>
> Dim lRet As Long = DateDiff(DateInterval.Minute, dtYmdhms_A, dtYmdhms_B)
>
> If lRet > 0 Then
> '処理
> End If

If文の比較式が逆だったようですね。正しくは
If lRet > 0 Then
' dtYmdhms_Bの方が大きいので、dtYmdhms_Bを使って処理する
End If

If lRet < 0 Then
' dtYmdhms_Aの方が大きいので、dtYmdhms_Aを使って処理する
End If
のどちらかですね。

以下のようにDateDiff関数の使い方を調べる実験プログラムを組んでみれば一目瞭然です。

Dim dtA As Date = #6/10/2009 11:03:01 AM# ' 11時
Dim dtB As Date = #6/10/2009 8:03:01 PM#  ' 20時

Console.WriteLine(DateDiff(DateInterval.Minute, dtA, dtB)) ' 540
Console.WriteLine(DateDiff(DateInterval.Minute, dtB, dtA)) ' -540

DateDiffの結果が正の数になるときの日付の引数の並びは、
第二引数の日付が過去で、第三引数の日付は未来を指定すると覚えると良いです。
つまり、dtA、dtBの順で指定する場合、dtBの方が未来である場合に戻り値は正の数になります。

誕生日から今時点までの日数を求めるという例で考えると直感的にわかりやすいかと思います。
DateDiff(DateInterval.DayOfYear, 誕生日, DateTime.Now))

解決済み
引用返信 編集キー/
■38776 / inTopicNo.7)  Re[5]: 日付の比較の仕方をおしえてください!
□投稿者/ Yoco (12回)-(2009/07/24(Fri) 20:54:13)
魔界の仮面弁士 さん、よねKEN さん

とても丁寧に教えていただき、ありがとうございます!!

すばらしく理解できました☆

VBとVB.NETの違いも微妙に解っていない「ど素人」ですが、頑張って精進します。。。

本当にありがとうございました!!!
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -