私は、VB の Date.Parse /ParseExact 機能を使って頭を悩ませています。推測するに、私はASP.Net 4.0アプリを持っています。ページの1つに、ユーザーが日付と時刻を選択するカレンダーコントロールがあり、これらは次のヨーロッパ/英国の日付と時刻の形式をとる文字列(strReqDeadline)に供給されます: dd/MM/yyyy HH:mm:ss.fff
たとえば、strReqDeadline の内容は次のようになります: 29/03/2013 16:30:00.000
次に、これを SQL の datetime 列に挿入する必要があるため、明らかに UK から US/datetime 形式に変換する必要があります。私はこれを Date.Parse と Date.ParseExact で実行しようとしましたが、成功しませんでした。私が行った調査によると、以下が機能するはずです。
strReqDeadline = "29/03/2013 16:30:00.000"
Dim usDate = As Date = Date.ParseExact(strReqDeadline, "dd/MM/yyyy HH:mm:ss.fff", System.Globalization.CultureInfo.InvariantCulture)
ただし、実行時に実際に発生するのは奇妙です.Date.ParseExact関数は時間からフラクタル秒を切り捨てます(私が見る限り、フィルターが.fffを指定しているため、これを行うべきではありません)、それ以外の場合は全体を残します文字列はまったく変更されていません。したがって、usDate の値が出力される場合、次のように表示されます。29/03/2013 16:30:00
含まれている必要があるのは、datetime: 3/29/2013 4:30PM です。
本当に奇妙なことは、usDate にウォッチを設定してアプリを起動すると、開発環境でその値が#3/29/2013 4:30PM#として表示され、ウォッチ リストとソース ウィンドウでホバーしたときの両方で、ただし、どの形式の出力でも元の文字列から秒の端数を引いたものが表示され、datetime には変換されません。
私が読んだところによると、「InvariantCulture」仕様は出力に関するロケール固有の問題を無効にする必要がありますが、これが問題である場合に備えて、System.Globalization.CultureInfo.CreateSpecificCulture("en-GB") ( fr-FR も試してみました)、しかし、これは違いはありません。クライアントとサーバーの両方の Windows 地域設定は、関連性がある場合は UK に設定されています。
たぶん、非常に明白な何かが欠けているかもしれませんが、なぜこの出力が得られるのかわかりません.Date.ParseExactは例外をスローしたり、文字列が認識されないことについて文句を言ったりしませんが、なぜ特に入力スプリングが指定されたマスクと正確に一致するため、小数秒を削除するだけで他には何もしません。
他の誰かがこのような奇妙な問題を経験したことがあるかどうか、そしてあなたがそれに対して何をしたかを聞くことに非常に興味があります!
ありがとう :)
編集: SQL セクションを含む完全なコードは次のとおりです。
strReqDeadline = "29/03/2013 16:30:00.000"
Dim usDate As Date = Date.ParseExact(strReqDeadline, "dd/MM/yyyy HH:mm:ss.fff", System.Globalization.CultureInfo.InvariantCulture)
'SQL
Dim con As New Data.SqlClient.SqlConnection("data source=XXXXX;initial catalog=YYYYY;Integrated Security=True")
Dim cmd As New Data.SqlClient.SqlCommand()
cmd.Connection = con
cmd.CommandText = "INSERT INTO Requests (ReqOwnerID, ReqDeadline, ReqStatus)" _
& "VALUES ('" & UserID & "', '" & usDate & "', '1')"
con.Open()
Dim NewReqID = cmd.ExecuteScalar()
con.Close()
'