J'ai besoin de convertir UTC
chaînes de date en DateTimeOffsets
.
Cela doit fonctionner avec un fuseau horaire différent du fuseau horaire de l'ordinateur. Par exemple. le fuseau horaire actuel de l'ordinateur est +02: 00, mais je veux créer un DateTimeOffset avec un décalage de -4: 00.
J'ai déjà lu beaucoup de questions ici sur stackoverflow, mais aucune d'entre elles n'a résolu mon problème.
Voilà ce que je dois faire:
Entrée: "2012-11-20T00: 00: 00Z"
Sortie: DateTimeOffset avec:
Bien entendu, l'heure d'été doit être prise en compte.
edit: Pour rendre les choses encore plus claires, veuillez essayer de compléter l'extrait de code suivant:
DateTimeOffset result;
const string dateString = "2012-11-20T00:00:00Z";
var timezone = TimeZoneInfo.FindSystemTimeZoneById("W. Europe Standard Time"); //this timezone has an offset of +01:00:00 on this date
//do conversion here
Assert.AreEqual(result.Offset, new TimeSpan(1, 0, 0)); //the correct utc offset, in this case +01:00:00
Assert.AreEqual(result.UtcDateTime, new DateTime(2012, 11, 20, 0, 0, 0)); //equals the original date
Assert.AreEqual(result.LocalDateTime, new DateTime(2012, 11, 20, 1, 0, 0));
Voici la solution que vous recherchez:
const string dateString = "2012-11-20T00:00:00Z";
var timezone = TimeZoneInfo.FindSystemTimeZoneById("W. Europe Standard Time"); //this timezone has an offset of +01:00:00 on this date
var utc = DateTimeOffset.Parse(dateString);
var result = TimeZoneInfo.ConvertTime(utc, timezone);
Assert.AreEqual(result.Offset, new TimeSpan(1, 0, 0)); //the correct utc offset, in this case +01:00:00
Assert.AreEqual(result.UtcDateTime, new DateTime(2012, 11, 20, 0, 0, 0)); //equals the original date
Assert.AreEqual(result.DateTime, new DateTime(2012, 11, 20, 1, 0, 0));
Notez que vous testiez incorrectement le .LocalDateTime
propriété - qui est toujours va convertir le résultat dans le fuseau horaire local de l'ordinateur. Vous avez simplement besoin du .DateTime
propriété à la place.
C'est ce que tu veux:
[Test]
public void ParseUtcDateTimeTest()
{
DateTime dateTime = DateTime.Parse("2012-11-20T00:00:00Z");
Assert.AreEqual(new DateTime(2012, 11, 20, 01, 00, 00), dateTime);
DateTimeOffset dateTimeOffset = new DateTimeOffset(dateTime);
Assert.AreEqual(new TimeSpan(0, 1, 0, 0), dateTimeOffset.Offset);
}
DateTime.Parse()
Est-ce utile pour votre conversion:
[Test]
public void ConvertTimeTest()
{
DateTime dateTime = DateTime.Parse("2012-11-20T00:00:00Z");
TimeZoneInfo cstZone = TimeZoneInfo.FindSystemTimeZoneById("Central Standard Time");
DateTime convertedTime = TimeZoneInfo.ConvertTime(dateTime, cstZone);
Assert.AreEqual(new DateTime(2012, 11, 19, 18, 00, 00), convertedTime);
TimeSpan baseUtcOffset = cstZone.BaseUtcOffset;
Assert.AreEqual(new TimeSpan(0, -6, 0, 0), baseUtcOffset);
}