Es hängt davon ab, was Sie mit "einer GMT + 1 Zeitzone" meinen. Meinst du permanent UTC + 1, oder meinst du UTC + 1 oder UTC + 2 abhängig von DST?
Wenn Sie .NET 3.5, verwenden TimeZoneInfo
zu erhalten eine entsprechende Zeitzone verwenden, dann verwenden:
// Store this statically somewhere
TimeZoneInfo maltaTimeZone = TimeZoneInfo.FindSystemTimeZoneById("...");
DateTime utc = DateTime.UtcNow;
DateTime malta = TimeZoneInfo.ConvertTimeFromUtc(utc, maltaTimeZone);
Sie müssen die System-ID für die Malta Zeitzone trainieren, aber Sie kann man erkennen, lokal, indem Sie diesen Code einfach tun:
Console.WriteLine(TimeZoneInfo.Local.Id);
durch Ihre Kommentare zu urteilen, wird dieses Bit irrelevant sein, aber nur für andere ...
Wenn Sie nicht mit .NET 3.5 verwenden, müssen Sie die Sommerzeit selbst berechnen. Um ehrlich zu sein, die einfachste Möglichkeit, das zu tun, wird eine einfache Nachschlagetabelle sein. Berechnen Sie die DST-Änderungen für die nächsten Jahre, und schreiben Sie dann eine einfache Methode, um den Offset zu einer bestimmten UTC-Zeit zurückzugeben, wobei diese Liste fest codiert ist. Sie könnten nur eine sortierte List<DateTime>
mit den bekannten Änderungen und wechseln zwischen 1 und 2 Stunden wollen, bis Sie das Datum nach der letzten Änderung ist:
// 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!");
}
Mit 'DateTime.UtcNow.AddHours (1)' stattdessen werden Sie sparen etwas tippen! – LukeH
Ja, das habe ich gemerkt. Aber ich bin mir nicht sicher, ob sie genau dasselbe tun; UtcNow holt die Systemzeit und führt einige Operationen mit "magischen Zahlen" aus, während ToUniversalTime die TimeZone.CurrentTimeZone verwendet, um die Utc-Zeit zu erhalten. Ich nehme an, dass sie immer die gleiche Zeit zurückgeben werden; o) –
'DateTime.Now' verwendet' UtcNow' hinter den Kulissen, so wird Ihr ursprünglicher Code in etwas wie 'DateTime.UtcNow.ToLocalTime() übersetzt. ToUniversalTime(). AddHours (1) '. – LukeH