2012-03-18 7 views
4

私はVS2010、C#の、ASP.NET使用して以下のようにコーディングしています:ASP.NETでC#を使用して文字列を日付に変換すると、時間が1時間になります。どうして?

DateTime dt = DateTime.Parse("2012-03-11T02:53:58-08:00"); //Date is taken from SQL database 
string strDt = dt.ToString(); //Becomes: "3/11/2012 3:53:58 AM" 

がマイクロソフトからこの4月の愚か者の冗談ですか?

+0

フィールドの型がすでに** ** datetimeの場合、文字列をdatetimeに解析するのはなぜですか? –

+0

この文脈で説明するのは難しいです。単に文字列をdatetimeに変換するだけです(SQLデータベースについては忘れてしまいます)。) – ahmd0

答えて

4

3月11日、 2012、2:38:58 AM、夏時間を守っている米国とカナダの地域で有効な日時ではありませんでした。明らかに、コードはこれらの領域のいずれかにあるコンピュータで実行されています。

は、任意のタイムゾーンオフセットを無視して、 DateTimeに文字列を変換するには、あなたが DateTimeOffset.Parseを呼び出し、結果の DateTimeコンポーネントを取得できます。

DateTime dt = DateTimeOffset.Parse("2012-03-11T02:53:58-08:00").DateTime; 
string strDt = dt.ToString(); // "3/11/2012 2:53:58 AM" 

UPDATE:だから、DateTime.Parseの違いは何とDateTimeOffset.Parse元の文字列にタイムゾーンオフセットが含まれている場合は?あなたの現在のタイムゾーンが太平洋標準時であると仮定し、これらの2つの例を考えてみます。

// Example 1: DateTime.Parse(String) 
DateTime dt = DateTime.Parse("2012-03-11T06:00:00-04:00"); 
Console.WriteLine(dt.ToString("o")); // 2012-03-11T03:00:00.0000000-07:00 

DateTime.Parse現地時に解析された日付と時刻を調整するオフセット使用しています。東部夏時間(UTC-04:00)から太平洋夏時間(UTC-07:00)への変換を反映して、時刻が午前6時から午前3時に変更されたことに注意してください。あなたの質問では、DateTime.Parseが太平洋標準時(UTC-08:00)から太平洋夏時間(UTC-07:00)に時間を自動的に調整したため、時間が変更されました。

// Example 2: DateTimeOffset.Parse(String) 
DateTimeOffset dto = DateTimeOffset.Parse("2012-03-11T06:00:00-04:00"); 
Console.WriteLine(dto.DateTime.ToString("o")); // 2012-03-11T06:00:00.0000000 
Console.WriteLine(dto.Offset);     // -04:00:00 

DateTimeOffset.Parseは簡単です。 DateTimeOffsetのプロパティが解析された日付、時刻、およびオフセットに設定されているDateTimeOffsetの値を返します。 注意:文字列のタイムゾーンのオフセットが、作業するタイムゾーンと一致しない場合は、結果の日付と時刻を自分で調整する必要があります。

+0

それは実際に働いた。どのように動作するのか説明してもらえますか? – ahmd0

+0

私の更新された回答を参照してください。それはすべて意味がありますか? –

+0

ありがとうございます。とても役に立ちました。私は彼らがちょうどそれらのAPIのラベルを付けてほしいと思います。 – ahmd0

4

あなたがいるタイムゾーンを許可しています。タイムストリングは、タイムゾーン付きのISO8601フォーマットです。

http://msdn.microsoft.com/en-us/library/1k1skd40.aspx

+0

OK。ありがとう。だから、どのように私は時間帯などを参照せずにそれを解析することは明らかに文字列内の日付を示しています。だから、私はDateTimeでまったく同じことをどうやって得るのですか? – ahmd0

3

それは冗談やタイムゾーンの問題ではありません。夏時間です。 Googleの "夏時間2012"、ここでの結果です:

夏時間(米国)2012年3月11日(日曜日)、午前2:00に開始し、2012年11月4日(日曜日)、午前2時を終了します。 アリゾナ州とハワイ州を除く。あなたの時計を春に1時間先に移動し、秋に1時間前に戻します(「春の前進、後退」)。言い換えれば

夏時間が観測されている場所、3月11日には2時53分58秒AMはありません、2012年クロックはストレート1時59分59秒AMから2時時間をスキップ〜3:00:00 AM。なぜあなたのsql datetimeは夏時間を観測しておらず、あなたのC#が実行しているマシンは - それは別の問題です..

+0

OK、意味があります...もしそれがDateTime.ParseWithRegardsToDaylightSaving()APIであったとしても、一般的なParseではなく!とにかく、この問題を隔離するために私は半日かかりました。ですから、私は解決に近づいています....とにかく、SQLデータベースについては忘れてしまいます。どのように文字列をDateTime変数に変換するだけで、文字列内の文字列に正確に変換できますか? – ahmd0

+1

2007年のDSTの変更に対応するためのパッチが適用されていない古いバージョンのWindows(2000または2003)がサーバーである可能性があります。 –

+0

"ParseWithRegardsToDaylightSaving()"メソッドに精通していませんが私はあなたの日時を取り巻く様々な時間であなたのコードをテストし、あなたの経験を確認し、それが夏時間の問題であることを確認しました。私はまだそれを無視し、文字列が言う日時を強制する方法を探しています。おかげさまで –

関連する問題