2009-07-10 13 views
8

DateTime.Now私は現在の日付に基づいて何かを表示しています(マルタ、ヨーロッパ)。私のホストサーバー(米国)にアップロードすると、DateTime.Nowは正しいタイムゾーンではありません。C#:DateTime.NowがGMT + 1を返すことを確認する

したがって、DateTime.NowをGMT + 1タイムゾーンから正確に返すように変換するにはどうすればよいですか?

答えて

14

のTimeZoneInfoクラスを使用します。コア;

これを行うには、DateTimeKindをDateTimeKind.Utcに設定する必要があります。

DateTime MyTime = new DateTime(1990, 12, 02, 19, 31, 30, DateTimeKind.Utc); 

DateTime MyTimeInWesternEurope = TimeZoneInfo.ConvertTimeBySystemTimeZoneId(MyTime, "W. Europe Standard Time"); 

ただし、.Net 3.5を使用している場合のみです。

4

コードで、コードが実行されるコンピュータの現在の時刻以外のものをDateTime.Nowが返すようにするプロパティをコード内に設定することはできません。あなたがいつも別の時間を得る方法を持っていたいなら、おそらく別の関数をラップする必要があります。あなたはUTC上のラウンドトリップを行い、所望のオフセットを追加することができますすることができます。システムで見つかった

private static DateTime GetMyTime() 
{ 
    return DateTime.UtcNow.AddHours(1); 
} 

(コードサンプルはDateTime.Nowの内部の仕組みにルークさんのコメントの後に更新)

+0

'DateTime.UtcNow.AddHoursを使用して(1)'代わりに保存されますいくつかの入力! – LukeH

+0

はい、私はそれを認識しました。しかし、私は彼らがまったく同じことをしているとは確信していません。 UtcNowはシステム時間を取得し、「マジックナンバー」でいくつかの操作を行いますが、ToUniversalTimeはTimeZone.CurrentTimeZoneを使用してUtc時間を取得します。私は彼らがいつも同じ時間を返すと思う; o) –

+0

'DateTime.Now'はシーンの裏でUtcNowを使うので、元のコードは' DateTime.UtcNow.ToLocalTime()。ToUniversalTime()のようなものに変換されます。 1) '。 – LukeH

14

「GMT + 1タイムゾーン」の意味によって異なります。あなたはUTC + 1を永久に意味するのですか、それともDSTに応じてUTC + 1またはUTC + 2を意味しますか?あなたは.NET 3.5を使用している場合

、適切なタイムゾーンを取得するためにTimeZoneInfoを使用し、使用します。

// Store this statically somewhere 
TimeZoneInfo maltaTimeZone = TimeZoneInfo.FindSystemTimeZoneById("..."); 
DateTime utc = DateTime.UtcNow; 
DateTime malta = TimeZoneInfo.ConvertTimeFromUtc(utc, maltaTimeZone); 

あなたはマルタのタイムゾーンのシステムIDをうまくする必要がありますが、あなたローカルにこのコードを実行することにより、簡単にそれを行うことができます。

Console.WriteLine(TimeZoneInfo.Local.Id); 

をあなたのコメントから判断すると、このビットは無関係になりますが、ちょうど他の人のために...

ではなく .NET 3.5を使用している場合は、自分で夏時間を調整する必要があります。正直言って、最も簡単な方法は単純なルックアップテーブルになるでしょう。今後数年間はDSTの変更を行い、そのリストがハードコードされた特定のUTC時間にオフセットを返す簡単な方法を書いてください。あなたの日付が最後に変更した後になるまで、あなただけの1と2時間の間で知られているの変化、および代替でソートList<DateTime>をお勧めします:

// Be very careful when building this list, and make sure they're UTC times! 
private static readonly IEnumerable<DateTime> DstChanges = ...; 

static DateTime ConvertToLocalTime(DateTime utc) 
{ 
    int hours = 1; // Or 2, depending on the first entry in your list 
    foreach (DateTime dstChange in DstChanges) 
    { 
     if (utc < dstChange) 
     { 
      return DateTime.SpecifyKind(utc.AddHours(hours), DateTimeKind.Local); 
     } 
     hours = 3 - hours; // Alternate between 1 and 2 
    } 
    throw new ArgumentOutOfRangeException("I don't have enough DST data!"); 
} 
+0

Jon、TimeZoneInfo.ConvertTimeFromUtcのパラメータを逆にするためにあなたの答えを編集しました –

+0

おかげさまで、ありがとうございました。奇妙なことは、私が実際にそれらを最初に確認したことです - とにかくそれらを間違った方法で得ました! –

+0

ソリューションでConvertTimeFromUtcメソッドにこの例外がスローされています。 指定されたDateTimeにKindプロパティが正しく設定されていないため、変換を完了できませんでした。たとえば、KindプロパティがDateTimeKind.Localの場合、ソースタイムゾーンはTimeZoneInfo.Localでなければなりません。 パラメータ名:sourceTimeZone –

関連する問題