zona horaria hora ejemplo convertir c# .net datetime datetimeoffset

c# - horaria - datetimeoffset sql



Convertir UTC DateTime en DateTimeOffset (3)

Necesito convertir UTC cadenas de fecha UTC a DateTimeOffsets .

Esto debe funcionar con una zona horaria que difiera de la zona horaria de las computadoras. Por ejemplo, la zona horaria actual de la computadora es +02: 00, pero quiero crear un DateTimeOffset con offset -4: 00.

Ya leí muchas preguntas aquí en stackoverflow, pero ninguna de ellas resolvió mi problema.

Eso es lo que necesito hacer:

Entrada: "2012-11-20T00: 00: 00Z"

Salida: DateTimeOffset con:

  • UtcDateTime del 2012-11-20 00:00
  • la compensación Utc correcta para la zona horaria definida (01:00 en este ejemplo)
  • LocalDateTime: 2012-11-20 01:00 (= UtcDateTime + Offset)

Por supuesto, el horario de verano debe tenerse en cuenta.

Editar : para aclarar aún más las cosas, intente completar el siguiente fragmento de código:

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


Aquí está la solución que estás buscando:

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

Tenga en cuenta que estaba probando incorrectamente la propiedad .LocalDateTime , que siempre va a convertir el resultado a la zona horaria local de la computadora. Simplemente necesitas la propiedad .DateTime lugar.


Es esto lo que quieres:

[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); }

  • Tenga en cuenta que mis afirmaciones son válidas en Suecia (CET)
  • Hay un par de sobrecargas en DateTime.Parse()

¿Es esto útil para su conversión?

[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); }


const String dateString = "2012-11-20T00:00:00Z"; var offsetDate = DateTimeOffset.Parse(dateString); var offsetDate2 = DateTime.Parse(dateString);

La salida es

offsetDate {20-11-2012 0:00:00 +00:00} System.DateTimeOffset offsetDate2 {20-11-2012 1:00:00} System.DateTime