Dipende da cosa si intende per "un GMT + 1 fuso orario". Intendi in modo permanente UTC + 1 o intendi UTC + 1 o UTC + 2 a seconda dell'ora legale?
Se si sta utilizzando .NET 3.5, utilizzare TimeZoneInfo
per ottenere un fuso orario appropriato, quindi utilizzare:
// Store this statically somewhere
TimeZoneInfo maltaTimeZone = TimeZoneInfo.FindSystemTimeZoneById("...");
DateTime utc = DateTime.UtcNow;
DateTime malta = TimeZoneInfo.ConvertTimeFromUtc(utc, maltaTimeZone);
Avrete bisogno di elaborare l'ID di sistema per il fuso orario di Malta, ma si può farlo facilmente eseguendo il codice a livello locale:
Console.WriteLine(TimeZoneInfo.Local.Id);
a giudicare dai vostri commenti, questo bit sarà irrilevante, ma solo per gli altri ...
Se siete non usando .NET 3.5, è necessario risolvere i legale da soli. Per essere onesti, il più semplice modo per farlo sta per essere una semplice tabella di ricerca. Elaborare le modifiche dell'ora legale per i prossimi anni, quindi scrivere un metodo semplice per restituire l'offset in una determinata ora UTC con tale elenco codificato. Si potrebbe desidera solo un ordinato List<DateTime>
con i cambiamenti noti, e si alternano tra 1 e 2 ore fino a quando la data è dopo l'ultima modifica:
// 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!");
}
fonte
2009-07-10 09:48:07
Usando 'DateTime.UtcNow.AddHours (1)' invece vi farà risparmiare un po 'di battitura! – LukeH
Sì, l'ho capito. Ma poi non sono sicuro che facciano esattamente la stessa cosa; UtcNow recupera l'ora del sistema e esegue alcune operazioni con "numeri magici", mentre ToUniversalTime utilizza TimeZone.CurrentTimeZone per ottenere l'ora Utc. Suppongo che sarà sempre tornare nello stesso tempo però;. O) –
'' DateTime.Now' utilizza UtcNow' dietro le quinte, in modo che il codice originale si traduce in qualcosa di simile a 'DateTime.UtcNow.ToLocalTime() ToUniversalTime() AddHours (. 1) '. – LukeH