Estoy tratando de usar DateTimeOffset
para transmitir un momento específico en el tiempo en cualquier zona horaria. No sé cómo usar TimeZoneInfo
para lidiar con el horario de verano.
var dt = DateTime.UtcNow;
Console.WriteLine(dt.ToLocalTime());
var tz = TimeZoneInfo.FindSystemTimeZoneById("Central Standard Time");
var utcOffset = new DateTimeOffset(dt, TimeSpan.Zero);
Console.WriteLine(utcOffset.ToOffset(tz.BaseUtcOffset));
Esto imprime:
2/6/2010 4:37:19 p.m. 2/6/2010 3:37:19 PM -06: 00
Estoy en la zona horaria central y actualmente estamos en el horario de verano. Estoy tratando de leer la segunda línea:
2/6/2010 4:37:19 PM -05: 00
BaseUtcOffset
aparentemente no cambia según el horario de verano.
¿Cómo puedo obtener el momento adecuado con el valor de compensación adecuado?
c#
datetimeoffset
timezone
jaminto
fuente
fuente
dt.Kind
esté configurado correctamente.Respuestas:
Necesita obtener el UtcOffset de TimeZoneInfo, luego pasarlo al método ToOffset ():
var dt = DateTime.UtcNow; Console.WriteLine(dt.ToLocalTime()); var tz = TimeZoneInfo.FindSystemTimeZoneById("Central Standard Time"); var utcOffset = new DateTimeOffset(dt, TimeSpan.Zero); Console.WriteLine(utcOffset.ToOffset(tz.GetUtcOffset(utcOffset)));
fuente
DateTimeOffset
.También puede utilizar TimeZoneInfo.ConvertTimeFromUtc, que permitirá el horario de verano:
DateTime utc = DateTime.UtcNow; TimeZoneInfo zone = TimeZoneInfo.FindSystemTimeZoneById("Central Standard Time"); DateTime localDateTime = TimeZoneInfo.ConvertTimeFromUtc(utc, zone);
fuente
O mejor, si no desea codificar el identificador de zona horaria :
fuente
TimeZoneInfo.Local
directamente? ¿Por qué necesitas la llamada aFindSystemTimeZoneById
?DateTime localDateTime = TimeZoneInfo.ConvertTimeFromUtc(networkDateTime, TimeZoneInfo.Local);
Soy un principiante tanto en .NET como en stackoverflow, por lo que podría estar equivocado, pero aquí va:
El uso de TimeZoneInfo.ConvertTimeFromUtc permitirá el horario de verano y lo convertirá a la hora correcta de acuerdo con la zona horaria + una posible compensación de DST. Sin embargo, el desplazamiento en sí mismo en el objeto resultante mostrará el desplazamiento de la hora estándar y no tendrá en cuenta el horario de verano. Entonces, si desea hacer un ToString en el objeto, terminará con la hora correcta (en horas y minutos), pero la compensación incorrecta durante el horario de verano, lo que puede llevar al momento equivocado en el tiempo más adelante en el código.
Si, en cambio, usa GetUtcOffset para obtener el desplazamiento para un tiempo específico y luego realiza un ToOffset en el objeto DateTimeOffset, tanto las horas / minutos como el desplazamiento en sí se convertirán correctamente, y puede hacer un ToString de forma segura.
string ExpectedDateTimePattern = "yyyy'-'MM'-'dd'T'HH':'mm':'ss''zzz"; string timeZoneId = "FLE Standard Time"; string dateTimestr = "2017-10-09T09:00:00+02:00"; DateTimeOffset dto = DateTimeOffset.Parse(dateTimeStr); TimeZoneInfo zone = TimeZoneInfo.FindSystemTimeZoneById(timeZoneId); TimeSpan offset = zone.GetUtcOffset(dto); dto = dto.ToOffset(offset); string localTime = dto.ToString(ExpectedDateTimePattern);
localTime devolverá "2017-10-09T10: 00: 00 + 03: 00".
datetimeoffset timezoneinfo getutcoffset
fuente