web-dev-qa-db-fra.com

Convertir UTC DateTime en DateTimeOffset

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:

  • UtcDateTime de 2012-11-20 00:
  • le décalage Utc correct pour le fuseau horaire défini (01:00 dans cet exemple)
  • LocalDateTime: 2012-11-20 01: (= UtcDateTime + Offset)

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));
26
Fabian

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.

13
Matt Johnson-Pint

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);
}
  • Notez que mes affirmations sont valables en Suède (CET)
  • Il y a quelques surcharges sur 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);
}
5
Johan Larsson