2010-07-29 6 views
6

Je cette ligne de code:C# DateTime fuseau horaire des problèmes de soustractions

double seconds = new DateTime(2006,7,6,12,1,0,DateTimeKind.Local).Subtract(new DateTime(1970,1,1,0,0,0,DateTimeKind.Local).TotalSeconds; 

Ce ne fut pas le nombre exact je voulais, donc j'essayé ce qui suit:

double seconds = new DateTime(2006,7,6,12,1,0,DateTimeKind.Local).Subtract(new DateTime(1970,1,1,0,0,0,DateTimeKind.Utc).TotalSeconds; 

(La différence est que dans un cas, j'utilise l'heure locale pour l'époque, et dans l'autre, j'utilise l'UTC). Curieusement, ils me donnent tous deux la même valeur, et je ne sais pas pourquoi. Je vis à -600 GMT, donc DateTimeKind.Local devrait réellement affecter les choses.

Merci d'avance!

Répondre

5

Dans la page DateTimeKind sur MSDN (http://msdn.microsoft.com/en-us/library/shx7s921.aspx), il est écrit:

Les membres de l'énumération DateTimeKind sont utilisés dans les opérations de conversion entre l'heure locale et le temps universel coordonné (UTC), mais pas dans des opérations de comparaison ou arithmétiques . Pour plus d'informations sur les conversions de temps, voir Conversion de durées entre fuseaux horaires.

Les conseils il dit utiliser TimeZoneInfo.ConvertTimeToUtc

Ainsi, sur cette base, le code devrait probablement être modifié pour:

double seconds = new DateTime(2006,7,6,12,1,0,DateTimeKind.Local).Subtract(TimeZoneInfo.ConvertTimeToUtc(new DateTime(1970,1,1,0,0,0,DateTimeKind.Local)).TotalSeconds 
+1

pour l'enregistrement, il en fait fini comme suit: double secondes = TimeZoneInfo.ConvertTimeToUtc (new DateTime (2006,7,6,12,1,0, DateTimeKind.Local)). Soustraire (new DateTime (1970,1,1,0,0, 0, DateTimeKind.Local) .TotalSeconds – codersarepeople

1

Essayez ceci:

namespace ConsoleApplication1 
{ 
    using System; 

    class Program 
    { 
     static void Main(string[] args) 
     { 
      var laterDate = new DateTime(2006, 7, 6, 12, 1, 0); 
      var earlyDate = new DateTime(1970, 1, 1, 0, 0, 0); 
      var diff = laterDate.ToUniversalTime().Subtract(earlyDate.ToUniversalTime()); 
      var seconds = diff.TotalSeconds; 
     } 
    } 
}