|
■No70343 (ぽこぽこ さん) に返信 > >>CDate(Now.ToString("yyyy-MM-dd")) >>ですが Date.Todayとしたほうがよいです。 > わざわざ有り難うございますm(__)m
あるいは、Now.Date のように、「Dateプロパティ」を使うという手法もあります。 Date プロパティは、Date型から時刻部を切り捨てて、日付だけを戻すプロパティです。
日付変数の部分をリテラル表記で記述するならば、 x = DateDiff("d", #3/13/2014 10:00:00 AM#, #3/15/2014#) ではなく、 x = DateDiff("d", #3/13/2014 10:00:00 AM#.Date, #3/15/2014#.Date) という処理にするイメージです。
その他、DateDiff 関数の代わりに下記のようにして計算することもできます。
Function GetDays(ByVal dateFrom As Date, ByVal dateTo As Date) As Integer Return (dateTo.Date - dateFrom.Date).Days End Function
Function GetTotalDays(ByVal dateFrom As Date, ByVal dateTo As Date) As Double Return (dateTo - dateFrom).TotalDays End Function
> 修正時こちらを使用します!
蛇足ですが、VB.NET における DateDiff の問題点は、時刻部の扱いだけでは無かったりします。
a = DateDiff( "yyyy", #1/5/1989#, #1/8/1989#) b = DateDiff( "yyyy", #1/5/1989#, #1/8/1990#)
VBA/VB6 で上記を算出すると、a は「0」年、b は「1」年を返しますが、 VB.NET の場合は事情が異なります。VBA と同じ結果を返すこともある一方、 a が「-63」年、bが「-62」年として計算されてしまうこともありえるのです。
それは、Windows のコントロールパネル「地域設定」が、和暦モードに設定されていた場合です。
和暦モードの場合、上記計算は a = 「昭和64年1月5日」から「平成元年1月8日」までの年数 b = 「昭和64年1月5日」から「平成2年1月8日」までの年数 という意味で演算されることになります。
その結果、a = 2 - 64、b = 1 - 64 として処理されます。 ("yyyy" を DateInterval.Year 指定に変更しても同様です)
もちろん、西暦モードであれば VBA と同じ結果を返しますが、 明らかに問題のある実装であると言えます。 (特に官公庁系や、保険業者系のユーザーでは、和暦設定にされている可能性が…)
また、日付がらみといえば、午前/午後の文字列書式にも問題があったりします。
VBA/VB6 の Format 関数においては、 a = Format(dt, "AM/PM hh:mm") b = Format(dt, "A/P hh:mm") のような記述があった場合、VB6/VBA では a は「AM 03:45」「PM 04:56」といった表記 b は「A 03:45」「P 04:56」といった表記 で変換されます。
VB.NET では書式文字列が変更になった関係で、上記が a = Format(dt, "tt hh:mm") b = Format(dt, "t hh:mm") に変更されるのですが、この結果はコントロールパネルの地域設定に依存して、 a は「AM 03:45」「PM 04:56」といった表記 b は「A 03:45」「P 04:56」といった表記 になる場合もあれば、 a は「午前 03:45」「午後 04:56」といった表記 b は「午 03:45」「午 04:56」といった表記 になる場合があります。しかも、日本語版 Windows の初期設定は後者です。
『午』では、何のことか分からないですよね…!
|