2009-09-12 10 views
7

¿Hay alguna manera de obtener la fecha 1 de enero de 1970 Greenwich Mean Time en un datetime?.NET Greenwich Mean Time

si sólo tiene que especificar la nueva fecha (1970, 1, 1) voy a conseguirlo con mi zona horaria actual ..

Respuesta

6

GMT es igual a UTC (Coordinate d Universal Time), más o menos (a menos que se trate de fracciones de segundos, no hay diferencia). DateTimeKind, una enumeración que le permite elegir si desea mostrar la hora en su zona horaria local o en UTC, está integrada en el DateTime constructor. Usando esto, podemos lograr el equivalente de GMT.

El constructor que estamos buscando a utilizar es la siguiente:

DateTime(int year, int month, int day, int hour, int minute, int second, int millisecond, DateTimeKind kind) 

o (en un solo hay un argumento milisegundos, en el otro no lo es):

DateTime(int year, int month, int day, int hour, int minute, int second, DateTimeKind kind) 

Para obtener un DateTime para 1 de enero de 1970 en UTC, esto es lo que podemos usar:

DateTime inGMT = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc); //using 1st constructor above 

o:

DateTime inGMT = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); //using 2nd constructor above 

NOTA: El contenido de la DateTimeKind enumeración son a continuación:

  • no especificadas (puede ser o bien la hora local o UTC)
  • Utc
  • Local

ACTUALIZACIÓN: Thomas Levesque propuso una solución muy creativa en su respuesta, sin embargo no estoy seguro de si es el método más directo y si es un método viable que puede ser utilizado para cualquier zona horaria. Lo que creo que está diciendo es que puede calcular el DateTimeOffset desde DateTime.Now y DateTime.UtcNow, y aplique la compensación calculada al 1 de enero de 1970 en su propia zona horaria, que le da la hora UTC/GMT. No estoy seguro de que haya métodos simples para calcular las compensaciones a otras zonas horarias, y esto se convierte en un poco redundante para la pregunta.

ACTUALIZACIÓN # 2: Agregué otro constructor DateTime que logra lo mismo, pero carece del argumento de milisegundos. Ellos son intercambiables.

+0

GMT * no * obedece el horario de verano. http://en.wikipedia.org/wiki/Greenwich_Mean_Time – LukeH

+0

Disculpa, fue un error. Fijo. –

2

GMT es, a todos los efectos prácticos, lo mismo que GMT.

Esto significa que puede simplemente usar uno de los DateTime constructors que toma un parámetro DateTimeKind, configurándolo en DateTimeKind.Utc.

DateTime gmt = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); 
+0

UTC no es exactamente GMT - GMT obedece DLT (horario de verano), aunque es la mayor parte del tiempo equivalente. – Noldorin

+2

UTC y GMT solo difieren en fracciones de segundo. GMT no tiene horario de verano. – Erik

+3

@Noldorin: GMT y UTC * son lo mismo *, a todos los efectos. GMT * no * obedece al horario de verano: en el Reino Unido actualmente es BST que es GMT + 1. http://en.wikipedia.org/wiki/Greenwich_Mean_Time – LukeH

3

Consulte la estructura de DateTimeOffset

EDIT: En realidad, después de leer más acerca DateTimeOffset, que podría no ser la solución más adecuada para lo que estamos tratando de hacer ... Creo que esto es la respuesta más directa a su pregunta:

DateTime epoch = DateTime.SpecifyKind(new DateTime(1970, 1, 1), DateTimeKind.Utc); 
+0

¡Usar DateTimeOffset sería una solución muy interesante! ¿Podría darnos algún código de muestra para mostrar cómo piensa usarlo para encontrar la hora GMT? ¿Va a encontrar el desplazamiento entre DateTime.Now y DateTime.UtcNow y luego aplicar el desplazamiento al 1 de enero de 1970 en su propia zona horaria? ¿O hay un enfoque más directo? ¡Muy interesante! –

+0

Además, ¿podría este enfoque (según mi interpretación de su respuesta, como se explica en el comentario anterior) funcionar para cada zona horaria a la que desea convertir? En otras palabras, ¿hay algo similar a DateTime.UtcNow disponible para otras zonas horarias? Si no, no creo que esta sea una solución universal viable. –

+0

@Thomas: No estoy de acuerdo con que esta sea "la respuesta más directa" a la pregunta: estás construyendo el 'DateTime' y luego llamando al método' SpecifyKind'. El mismo resultado se puede lograr simplemente llamando a un constructor diferente, sin necesidad de una llamada de método extra. (Vea mi respuesta para más detalles.) – LukeH