ejemplo - timezone c#
¿Cómo se usa TimeZoneInfo para obtener la hora local durante el horario de verano? (4)
Intento utilizar DateTimeOffset para transmitir un momento específico en el tiempo en cualquier zona horaria. No puedo entender 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 se imprime:
6/2/2010 4:37:19 PM
6/2/2010 3:37:19 PM -06:00
Estoy en la zona horaria central, y actualmente estamos en horario de verano. Estoy tratando de leer la segunda línea:
6/2/2010 4:37:19 PM -05:00
BaseUtcOffset aparentemente no cambia en función del horario de verano.
¿Cómo puedo obtener el momento adecuado con el valor de compensación correcto?
Gracias.
Debe obtener UtcOffset de TimeZoneInfo y 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)));
También puede usar 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);
O mejor, si no desea codificar el identificador de zona horaria :
TimeZoneInfo tzi = TimeZoneInfo.FindSystemTimeZoneById(TimeZoneInfo.Local.Id);
DateTime localDateTime = TimeZoneInfo.ConvertTimeFromUtc(DateTime.UtcNow, tzi);
Soy principiante tanto en .NET como en , así que podría estar equivocado, pero aquí va:
El uso de TimeZoneInfo.ConvertTimeFromUtc permitirá el horario de verano y convertirá a la hora correcta de acuerdo con la zona horaria + un posible desplazamiento de DST. Sin embargo, el desplazamiento en sí en el objeto resultante mostrará el desplazamiento para la hora estándar y no tendrá en cuenta el horario de verano. Por lo tanto, si desea hacer un ToString en el objeto, terminará con la hora correcta (en horas y minutos), pero con el desplazamiento incorrecto durante el horario de verano, lo que puede ocasionar un momento incorrecto 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 se convertirán correctamente, y podrá hacer un ToString de manera 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