2012-05-19 20 views
19

Come verificare se in Danimarca il risparmio di ora legale ha avuto effetto, in caso affermativo, quindi aggiungere 1 ora ai miei dati, altrimenti no? Ho un file xml:Controllare se è in vigore l'ora legale?

<day = "1" 
month = "5" 
sunrise ="06:30" 
sunset ="21:30" 
/> 

risposta

44

pensi di aver bisogno di convertire questo XML per DateTime e quindi utilizzare la classe TimeZoneInfo.

Se la Danimarca l'ora locale:

DateTime thisTime = DateTime.Now; 
bool isDaylight = TimeZoneInfo.Local.IsDaylightSavingTime(thisTime); 

il resto è necessario per ottenere la Danimarca fuso orario:

DateTime thisTime = DateTime.Now; 
// get Denmark Standard Time zone - not sure about that 
TimeZoneInfo tst = TimeZoneInfo.FindSystemTimeZoneById("Denmark Standard Time"); 
bool isDaylight = tst.IsDaylightSavingTime(thisTime); 
+0

Perchè questo does't funziona bene con "E. Sud America Standard Time" per la specifica 'nuova DateTime (1995, 10, 15)' date? Non puoi testarlo qui https://dotnetfiddle.net/ilwIZu e nella storia della documentazione su https://pt.m.wikipedia.org/wiki/Lista_de_períodos_em_que_vigorou_o_horário_de_verão_no_Brasil 1995-10-15 è davvero una luce diurna –

4

È possibile utilizzare TimeZoneInfo.IsDaylightSavingTime

DateTime theDate = new DateTime(2012, 5, 1); // may 1st 
TimeZoneInfo tzi = TimeZoneInfo.FindSystemTimeZoneById("Central European Standard Time"); 
bool isCurrentlyDaylightSavings = tzi.IsDaylightSavingTime(theDate); 
6

Quando ho codificato come sopra - per New-York, ho trovato nel debugger che la il tempo è stato impostato correttamente (incluso l'ora legale)

TimeZoneInfo nyTimeZone = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time"); 

DateTime nyTime = GetLocalDateTime(DateTime.UtcNow, nyTimeZone); 

if (nyTimeZone.IsDaylightSavingTime(nyTime)) 
    nyTime = nyTime.AddHours(1); 

public static DateTime GetLocalDateTime(DateTime utcDateTime, TimeZoneInfo timeZone) 
    { 

     utcDateTime = DateTime.SpecifyKind(utcDateTime, DateTimeKind.Utc); 

     DateTime time = TimeZoneInfo.ConvertTime(utcDateTime, timeZone); 

     return time; 

    } 
+0

Che cosa è ' GetLocalDateTime'? – Kiquenet

+0

Scusa, ho dimenticato di copiare il metodo. Modificato sopra –

0

Ecco un test generico e felice di essere corretto se la mia matematica è errato. Nel mio caso, avevo solo bisogno di ottenere l'offset GMT per il fuso orario indipendentemente da dove fosse nel mondo.

int timezone; 

    TimeZoneInfo localZone = TimeZoneInfo.Local; 

    DateTime myTime = DateTime.Now; 

    bool isDayLight = TimeZoneInfo.Local.IsDaylightSavingTime(myTime); 

    if (isDayLight) 
      timezone = Math.Abs(localZone.BaseUtcOffset.Hours) + 1; 
    else 
      timezone = Math.Abs(localZone.BaseUtcOffset.Hours); 

    Debug.WriteLine("timezone is " + timezone); 

Ho semplicemente trovato l'ora corrente e se era in periodo di risparmio luce giorno aggiunto +1 allo scostamento GMT.

Questo funziona con Visual Studio Express 2013

0

Hai bisogno di fare due cose:

  1. chiamata IsAmbiguous
  2. voce dell'Elenco IsDaylightSavingTime.

if (TimeZoneInfo.Local.IsAmbiguousTime(unclearDate) || TimeZoneInfo.Local.IsDaylightSavingTime(unclearDate)) Console.WriteLine("{0} may be daylight saving time in {1}.", unclearDate, TimeZoneInfo.Local.DisplayName);

https://msdn.microsoft.com/en-us/library/bb460642(v=vs.110).aspx

+0

Che cos'è 'IsAmbiguous'? – Kiquenet

Problemi correlati