1

私は、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()

'

4

3 に答える 3

2

なぜあなたは薄いのにうまくいかないのですか?これらはすべて同じ基になる日付/時刻です。

29/03/2013 16:30:00.000

29/03/2013 16:30:00

3/29/2013 4:00PM

文字列以外の変数の上にカーソルを置いたときに表示される内容に依存して、その内部値を決定することはできません。表示されているのは の評価のみですToString()。文字列に小数秒を表示する場合は、ToString()「dd/MM/yyyy HH:mm:ss.fff」という形式を呼び出して指定する必要があります。に変換するときに分数秒を表示しない場合、デフォルトでは DateTime タイプですString


パラメータを使用していない場合 (使用する必要があります)、DateTime を挿入した後の最終的な SQL ステートメントは次のようになります。

INSERT INTO MyTableWithDate
   (column1
   ,column2
   ,MyDateCol)
VALUES 
   ('a'
   ,'b'
   ,'20130329 16:30:00.557')

前に述べたように、Dateデータ型は String ではありません。これはオブジェクトです (というか、余談ですが、DateTime 構造体です)。正しいmethod0dを呼び出す必要があります。ToString()

SQL文字列でこれを使用してみてください:

& "VALUES ('" & UserID & "', '" & usDate.ToString("yyyyMMdd HH:mm:ss.fff") & "', '1')"

もちろん、文字列を Date オブジェクトに変換してすぐに再び文字列に変換する意味はほとんどありませんが、このコードは機能するはずです。

于 2013-03-21T11:57:27.073 に答える
2

usDate は DateTime 型のオブジェクトであり、正しい値を格納しているように見えます。調べていると、その日時値の文字列表現が表示されます。29/03/2013 16:30:00 も 3/29/2013 4:30PM も含まれていません。これらは含まれているものの 2 つの有効な表現です。

あなたは言う

どの形式の出力でも元の文字列が表示されます

本当じゃない。実際、フォーマットを指定できる ToString() を呼び出すときに、出力方法を制御できます。

于 2013-03-21T12:00:08.567 に答える
1

あなたがしていることは正しいように見えます。つまり、 Date.ParseExact を使用して、英国形式の日付を日付型に変換しています。あなたが抱えている問題は、これを文字列として表示すると、ローカル カルチャで表示される (デバッガーは常に米国形式で表示するように見える) ことですが、設定した日付は正しいです。

于 2013-03-21T12:04:00.490 に答える