DateTime.Now
私は現在の日付に基づいて何かを表示しています(マルタ、ヨーロッパ)。私のホストサーバー(米国)にアップロードすると、DateTime.Now
は正しいタイムゾーンではありません。C#:DateTime.NowがGMT + 1を返すことを確認する
したがって、DateTime.Now
をGMT + 1タイムゾーンから正確に返すように変換するにはどうすればよいですか?
DateTime.Now
私は現在の日付に基づいて何かを表示しています(マルタ、ヨーロッパ)。私のホストサーバー(米国)にアップロードすると、DateTime.Now
は正しいタイムゾーンではありません。C#:DateTime.NowがGMT + 1を返すことを確認する
したがって、DateTime.Now
をGMT + 1タイムゾーンから正確に返すように変換するにはどうすればよいですか?
の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を使用している場合のみです。
コードで、コードが実行されるコンピュータの現在の時刻以外のものをDateTime.Nowが返すようにするプロパティをコード内に設定することはできません。あなたがいつも別の時間を得る方法を持っていたいなら、おそらく別の関数をラップする必要があります。あなたはUTC上のラウンドトリップを行い、所望のオフセットを追加することができますすることができます。システムで見つかった
private static DateTime GetMyTime()
{
return DateTime.UtcNow.AddHours(1);
}
(コードサンプルはDateTime.Nowの内部の仕組みにルークさんのコメントの後に更新)
「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!");
}
Jon、TimeZoneInfo.ConvertTimeFromUtcのパラメータを逆にするためにあなたの答えを編集しました –
おかげさまで、ありがとうございました。奇妙なことは、私が実際にそれらを最初に確認したことです - とにかくそれらを間違った方法で得ました! –
ソリューションでConvertTimeFromUtcメソッドにこの例外がスローされています。 指定されたDateTimeにKindプロパティが正しく設定されていないため、変換を完了できませんでした。たとえば、KindプロパティがDateTimeKind.Localの場合、ソースタイムゾーンはTimeZoneInfo.Localでなければなりません。 パラメータ名:sourceTimeZone –
'DateTime.UtcNow.AddHoursを使用して(1)'代わりに保存されますいくつかの入力! – LukeH
はい、私はそれを認識しました。しかし、私は彼らがまったく同じことをしているとは確信していません。 UtcNowはシステム時間を取得し、「マジックナンバー」でいくつかの操作を行いますが、ToUniversalTimeはTimeZone.CurrentTimeZoneを使用してUtc時間を取得します。私は彼らがいつも同じ時間を返すと思う; o) –
'DateTime.Now'はシーンの裏でUtcNowを使うので、元のコードは' DateTime.UtcNow.ToLocalTime()。ToUniversalTime()のようなものに変換されます。 1) '。 – LukeH