2010-08-05 31 views
8

estoy un poco perdido en la zona horaria :)convertir la hora local, de alguien a la hora UTC

tengo datos almacenados con el tiempo en UTC. El servidor está en los Países Bajos, entonces vivimos en utc + 1 (ahora, con daylightsavingtime, en utc + 2)

Ahora un cliente dice: dame los datos del 5 de agosto.

así que tengo que calcular el tiempo UTC de 'su tiempo'. Para que tengo que saber:

lo que es su desplazamiento UTC (que se almacena en su perfil que, digamos -6 GMT) que están en daylightsavingtime (porque entonces hay que añadir 1 y hacer que el desplazamiento UTC -5)

Entonces mis preguntas:

  1. ¿Puedo pedir el marco .Net: ¿tiene el país XX tener daylightsavingtime?

  2. ¿Puedo pedir el marco .Net: es 08-05-2010T00: 00: 00 en el país XXX daylightsavingtime en ese momento?

he estado tratando el .ToLocalTime(), pero esto sólo me da la hora local en el servidor, y eso no es lo que quiero de, quiero calcular con la zona horaria del usuario, y también con el hecho de que en ese momento en particular, si él/ella está en daylightsavingtime

también he visto este ejemplo VB:

TimeZone As TimeZoneInfo = TimeZoneInfo.FindSystemTimeZoneById("W. Europe Standard Time") 
Dim Dated As DateTime = TimeZoneInfo.ConvertTimeToUtc(TempDate, TimeZone) 

pero en mi humilde opinión esto no toma en cuenta que el usuario en esta zona horaria está o no está en un país de horario de verano (dst). Por ejemplo, un usuario en esta zona horaria está en los países bajos que tienen dst, y otro está en otro país que no tiene dst.

+1

pregunta relacionada - http://stackoverflow.com/questions/2532729/daylight-saving-time-and-timezone-best-practices – Oded

+0

gran recurso! – Michel

Respuesta

6

no se puede pedir el marco de un país en particular - pero se puede preguntar acerca de una zona horaria determinada .

TimeZoneInfohace tenga en cuenta el horario de verano. (Heck, no tendría el método IsDaylightSavingTime lo contrario.) Si usted tiene dos usuarios, uno de los cuales está actualmente observando el horario de verano y el otro de los cuales no lo es, entonces no está en la misma zona horaria .

Si usted podría especificar las ubicaciones que está hablando, podría tratar de averiguar qué zonas horarias están involucrados. (Por lo general es más fácil de averiguar los nombres Olson, pero no debería ser imposible averiguar el ID de Windows).

+0

Ok, gracias. ¿Pero está diciendo que los usuarios deben cambiar su zona horaria cuando ingresan el horario de verano? por ejemplo, normalmente estoy en GMT + 1 Amsterdam, pero luego se ingresa el horario de verano, ¿estoy en GMT + 2? ¿O estoy en GMT + 1 en horario de verano? Si es el caso anterior, el usuario debe cambiar su zona horaria en mi aplicación. (En ese caso se trabajará como usted dice, porque el usuario, que vive en un país en el horario de verano cambia su zona horaria a 2, y el usuario, que vive en un país sin cambio horario guarda su zona horaria en +1) – Michel

+0

@Michel: No, la zona horaria describe cuándo entra y sale el horario de verano. Por ejemplo, estoy en la zona horaria con el nombre de Olson "Europa/Londres", es UTC durante la mitad del año y UTC + 1 durante la mitad del año. Su usuario en un país de horario de verano * no * cambia la zona horaria: sus cambios de zona horaria cambian de UTC. Es una distinción muy importante. –

+0

@Jon: bien, no sabía que TimeZone tenía el conocimiento de cuándo el horario de verano comienza finales finales. Pero: también tengo que saber dónde vives, porque puedo verificar el TimeZone si tu zona está en horario de verano en este momento, pero también tengo que saber si tu país (ya que hay varios países en tu zona horaria) funciona con horario de verano o no. ? – Michel

2

clase de zona horaria tiene un IsDaylightSavingTime método que tomar una fecha como parámetro y devolver un valor booleano que indica si ese fecha en daylights hora de salida para esa zona horaria.

+0

Gracias, pero eso solo funciona para las horas locales, en mi caso, en una aplicación de servidor asp.net, esa será la hora de la ubicación donde se encuentra el servidor. caso puedo verificar si el SERVIDOR está en dst, pero no si el usuario está en un huso horario en particular. – Michel

2

promocionar mi comentario a una respuesta. Parece ser un problema complicado. Mira http://www.timeanddate.com/time/dst2010.html, hay una tabla de DST en varios países del mundo. No puede obtener esto con un código estático porque el horario de verano cambia no solo de un país a otro, sino también de un año a otro.

supongo que tiene que mantener una tabla con información de DST y obtener información de ella.

O puede consultar un servicio web para obtener dichas informaciones.

Mire http://www.earthtools.org/webservices.htm#timezone para un servicio web que puede consultar para obtener tiempo en varios países que tengan en cuenta el horario de verano (solo funciona para zonas horarias de Europa occidental). También vea http://www.geonames.org/export/web-services.html. Debe utilizar la geolocalización de sus usuarios para usar estos servicios.

+0

He encontrado esto: 'timeZone.GetAdjustmentRules() [0] .DaylightTransitionStart' que me dice cuando el dst comienza en una zona en particular, ¿es lo mismo? – Michel

+0

Miro en MSDN. Es casi lo mismo, pero de acuerdo con la información en http://www.timeanddate.com/time/dst2010.html la información DST es dinámica, que cambia en el tiempo de acuerdo con la modificación de las leyes de los países, por lo que no se puede "incrustar" en un marco estático. De todos modos, supongo que las modificaciones en las leyes no ocurren con tanta frecuencia, así que si no te molestas en cometer un error en el cálculo de vez en cuando, puedes elegir DaylightTransitionStart. –

Cuestiones relacionadas