J'utiliserais mon Heure de Noda personnellement. (Certes, je suis partial en tant qu'auteur, mais ce serait plus propre...) Mais si vous ne pouvez pas le faire...
Soit utiliser DateTime.ParseExact
en spécifiant le format exact que vous attendez, et inclure DateTimeStyles.AssumeUniversal
et DateTimeStyles.AdjustToUniversal
dans le code d'analyse :
using System;
using System.Globalization;
class Test
{
static void Main()
{
var date = DateTime.ParseExact("2012-09-30T23:00:00.0000000Z",
"yyyy-MM-dd'T'HH:mm:ss.fffffff'Z'",
CultureInfo.InvariantCulture,
DateTimeStyles.AssumeUniversal |
DateTimeStyles.AdjustToUniversal);
Console.WriteLine(date);
Console.WriteLine(date.Kind);
}
}
(On peut se demander pourquoi il s'ajusterait à local par défaut sans AdjustToUniversal
me dépasse, mais tant pis...)
EDIT : Pour développer mes objections à la suggestion de mattytommo, j'ai cherché à prouver qu'il y aurait perte d'information. J'ai échoué jusqu'à présent - mais d'une manière très particulière. Jetez un coup d'oeil à ceci - fonctionnant dans le fuseau horaire Europe/Londres, où les horloges reculent le 28 octobre 2012, à 2 heures du matin heure locale (1 heure UTC) :
DateTime local1 = DateTime.Parse("2012-10-28T00:30:00.0000000Z");
DateTime local2 = DateTime.Parse("2012-10-28T01:30:00.0000000Z");
Console.WriteLine(local1 == local2); // True
DateTime utc1 = TimeZoneInfo.ConvertTimeToUtc(local1);
DateTime utc2 = TimeZoneInfo.ConvertTimeToUtc(local2);
Console.WriteLine(utc1 == utc2); // False. Hmm.
On dirait qu'il y a un drapeau "avec ou sans DST" qui est stocké. quelque part mais je serai soufflé si je peux trouver où. Les documents pour TimeZoneInfo.ConvertTimeToUtc
état
Si dateTime correspond à une heure ambiguë, cette méthode suppose qu'il s'agit de l'heure standard du fuseau horaire source.
Ce n'est pas apparaître pour être le cas ici en convertissant local2
...
EDIT : Ok, ça devient encore plus étrange - cela dépend de la version du framework que vous utilisez. Considérez ce programme :
using System;
using System.Globalization;
class Test
{
static void Main()
{
DateTime local1 = DateTime.Parse("2012-10-28T00:30:00.0000000Z");
DateTime local2 = DateTime.Parse("2012-10-28T01:30:00.0000000Z");
DateTime utc1 = TimeZoneInfo.ConvertTimeToUtc(local1);
DateTime utc2 = TimeZoneInfo.ConvertTimeToUtc(local2);
Console.WriteLine(utc1);
Console.WriteLine(utc2);
DateTime utc3 = local1.ToUniversalTime();
DateTime utc4 = local2.ToUniversalTime();
Console.WriteLine(utc3);
Console.WriteLine(utc4);
}
}
Donc cela prend deux différents UTC, les analyse avec DateTime.Parse
puis les reconvertit en UTC de deux manières différentes.
Résultats sous .NET 3.5 :
28/10/2012 01:30:00 // Look - we've lost information
28/10/2012 01:30:00
28/10/2012 00:30:00 // But ToUniversalTime() seems okay...
28/10/2012 01:30:00
Résultats sous .NET 4.5 beta :
28/10/2012 00:30:00 // It's okay!
28/10/2012 01:30:00
28/10/2012 00:30:00
28/10/2012 01:30:00