Estoy tratando de crear una prueba unitaria para probar el caso cuando la zona horaria cambia en una máquina porque se ha configurado incorrectamente y luego se ha corregido.
En la prueba, necesito poder crear objetos DateTime en una zona horaria que no sea local para garantizar que las personas que ejecutan la prueba puedan hacerlo con éxito independientemente de dónde se encuentren.
Por lo que puedo ver desde el constructor DateTime, puedo configurar TimeZone para que sea la zona horaria local, la zona horaria UTC o no especificada.
¿Cómo creo un DateTime con una zona horaria específica como PST?
Respuestas:
La respuesta de Jon habla de TimeZone , pero sugeriría usar TimeZoneInfo en su lugar.
Personalmente, me gusta mantener las cosas en UTC siempre que sea posible (al menos para el pasado; almacenar UTC para el futuro tiene problemas potenciales ), por lo que sugeriría una estructura como esta:
Es posible que desee cambiar los nombres de "TimeZone" a "TimeZoneInfo" para aclarar las cosas. Prefiero los nombres más breves.
fuente
La estructura DateTimeOffset se creó exactamente para este tipo de uso.
Ver: http://msdn.microsoft.com/en-us/library/system.datetimeoffset.aspx
Aquí hay un ejemplo de cómo crear un objeto DateTimeOffset con una zona horaria específica:
DateTimeOffset do1 = new DateTimeOffset(2008, 8, 22, 1, 0, 0, new TimeSpan(-5, 0, 0));
fuente
Las otras respuestas aquí son útiles, pero no cubren cómo acceder específicamente a Pacific; aquí tienes:
Por extraño que parezca, aunque "Hora estándar del Pacífico" normalmente significa algo diferente de "Hora de verano del Pacífico", en este caso se refiere a la hora del Pacífico en general. De hecho, si usa
FindSystemTimeZoneById
para buscarlo, una de las propiedades disponibles es un bool que le dice si esa zona horaria está actualmente en horario de verano o no.Puede ver ejemplos más generalizados de esto en una biblioteca que terminé juntando para tratar con DateTimes que necesito en diferentes TimeZones en función de dónde pregunta el usuario, etc.
https://github.com/b9chris/TimeZoneInfoLib.Net
Esto no funcionará fuera de Windows (por ejemplo, Mono en Linux) ya que la lista de veces proviene del Registro de Windows:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones\
Debajo encontrará claves (iconos de carpeta en el Editor del Registro); los nombres de esas teclas son a lo que pasas
FindSystemTimeZoneById
. En Linux, debe usar un conjunto separado de definiciones de zonas horarias estándar de Linux, que no he explorado adecuadamente.fuente
Alteré Jon Skeet responder un poco para la web con el método de extensión. También funciona en azul como un encanto.
fuente
Tendrás que crear un objeto personalizado para eso. Su objeto personalizado contendrá dos valores:
No estoy seguro de si ya hay un tipo de datos proporcionado por CLR que lo tenga, pero al menos el componente TimeZone ya está disponible.
fuente
Me gusta la respuesta de Jon Skeet, pero me gustaría agregar una cosa. No estoy seguro de si Jon esperaba que el ctor se pasara siempre en la zona horaria local. Pero quiero usarlo para casos en los que es algo diferente a lo local.
Estoy leyendo valores de una base de datos, y sé en qué zona horaria se encuentra esa base de datos. Entonces, en el ctor, pasaré la zona horaria de la base de datos. Pero luego me gustaría el valor en hora local. Jon's LocalTime no devuelve la fecha original convertida en una fecha de zona horaria local. Devuelve la fecha convertida en la zona horaria original (lo que haya pasado al ctor).
Creo que estos nombres de propiedad lo aclaran ...
fuente
El uso de la clase TimeZones facilita la creación de la fecha específica de la zona horaria.
fuente