zona timezoneinfo horas horaria hora formato fecha cambiar actual c# datetime timezone

timezoneinfo - timezone c#



Especifique una fecha en otra zona horaria C# (4)

Parece que pude responder mi propia pregunta. Aquí está el código que estoy usando para obtener un objeto DateTime siguiente ejecución.

private DateTime GetNextRun() { var today = DateTime.Today; var runTime = new DateTime(today.Year, today.Month, today.Day, 17, 0, 0); var timeZoneInfo = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time"); var offset = timeZoneInfo.GetUtcOffset(runTime); var dto = new DateTimeOffset(runTime, offset); if (DateTime.Now > dto.LocalDateTime) dto = dto.AddDays(1); return dto.LocalDateTime; }

Hacer todas las conversiones usando DateTimeOffset lugar de DateTime resultó efectivo. Incluso parece manejar el horario de verano correctamente.

Tengo una aplicación asp.net que debe ejecutar algún código todos los días a una hora específica en la zona horaria del este (DST consciente). Así que mi primer pensamiento es, obtener el valor del tiempo del este y convertirlo a la hora del servidor local.

Entonces necesito algo como esto:

var eastern = DateTime.Today.AddHours(17); // run at 5pm eastern var timeZoneInfo = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time"); var utc = TimeZoneInfo.ConvertTimeToUtc(eastern, timeZoneInfo); var local = TimeZoneInfo.ConvertTimeFromUtc(utc, TimeZoneInfo.Local);

Pero, ¿cómo especifico que el objeto DateTime del este debería estar en la zona horaria EST?

¿Me estoy acercando a esto de la manera incorrecta?


Primero, hay varias cosas que debes tener en cuenta. Tiene que lidiar con el horario de verano, que de vez en cuando parece cambiar (las fechas de inicio y final han cambiado dos veces en los últimos 10 años). Por lo tanto, en el invierno del hemisferio norte, la hora del este es -5 GMT (o UTC). Pero, en el verano es -6 GMT o es -4 GMT, nunca puedo mantenerlo en línea recta (ni debería hacerlo).

Hay algunas funciones de la biblioteca DNF para tratar la información de la zona horaria, sin embargo, realmente necesita .net 3.5 para las cosas más útiles. Está la clase TimeZoneInfo en .net 3.5.

TimeZoneInfo tzi = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time"); DateTime dt = TimeZoneInfo.ConvertTimeBySystemTimeZoneId(DateTime.Now, TimeZoneInfo.IsDaylightSavingsTime(tzi) ? tzi.DaylightName : tzi.StandardName); if (dt.Hour == 17) ....

Además, tenga en cuenta que dos veces al año se pierde o gana una hora, por lo que también debe tener en cuenta que, si, por ejemplo, tiene un temporizador de cuenta atrás, visualiza "tiempo hasta el siguiente procesamiento" o algo así. El hecho es que el manejo del tiempo no es tan fácil como parece a primera vista, y hay muchos casos extremos.


Puede usar DateTime.UtcNow para obtener la hora central de UTC (que creo que es GMT 0) y desde allí solo averiguar cuántas zonas horarias es la que desea y eliminar / agregar una hora para cada zona.


Un DateTime no sabe acerca de un huso horario. Incluso DateTimeOffset realmente no sabe acerca de una zona horaria: sabe acerca de un instante UTC y un desplazamiento de eso.

Puedes escribir tu propia estructura, que tiene TimeZoneInfo y DateTime , pero no estoy seguro de que la necesites en este caso. ¿Estás tratando de programar las 5 p.m. en hora del Este, o es más general? ¿Qué estás haciendo con DateTime (o lo que sea) después? Usando DateTimeOffset y TimeZoneInfo definitivamente puede obtener el instante UTC del tiempo que le interesa; si solo necesitas saber el tiempo entre "ahora" y luego, eso es bastante fácil.

Me siento obligado a señalar que cuando Noda Time esté lista para la producción, seguramente sería la respuesta correcta :)