2008-11-26 28 views
8

Tengo un problema con el tiempo
Mi servidor está en los EE. UU. Y estoy en Dinamarca (Europa) y me gustaría que mi sitio muestre la hora en mi hora local. ¿Cómo puedo hacer eso?cómo convertir la hora del servidor a hora local

de que este intento

Datetime localtime = DateTimeOffset.Now.ToOffset(new TimeSpan(1,0,0)).DateTime; 

y funciona, pero sólo funcionará cuando estoy en GMT + 1/GMT + 1 y no cuando estoy en GMT + 2/UTC + 2. ¿Hay alguna otra forma de hacerlo, una forma más sencilla de hacerlo?

Respuesta

11

La única forma en que debe hacerlo es el siguiente:

string zoneId = "Central European Standard Time"; 
TimeZoneInfo tzi = TimeZoneInfo.FindSystemTimeZoneById(zoneId); 
DateTime result = TimeZoneInfo.ConvertTimeFromUtc(DateTime.UtcNow,tzi); 
Console.WriteLine("Time is " + result + " in Denmark"); 

Utilización de la clase TimeZoneInfo es la única manera confiable en .Net para convertir a/desde diferentes zonas horarias y obtener conversiones DST adecuados.

TimeZoneInfo.ConvertTimeToUtc(dtLocal,tzi) es la conversión inversa de una hora local a una hora final.


Para las cadenas de ID de zona horaria, puede ejecutar el trozo de código aquí ...

foreach(var tz in TimeZoneInfo.GetSystemTimeZones()) 
{ 
    Console.WriteLine(tz.DisplayName + " is Id=','" + tz.Id + "'"); 
} 
+1

Debe tenerse en cuenta que TimeZoneInfo tiene en cuenta correctamente las diferencias de horario de verano en cuenta para el futuro y los tiempos pasados ​​también. No se sienta tentado a hacer las conversiones usando BaseUtcOffset o GetUtcOffset(). También puede verificar tiempos no válidos y ambiguos usando TimeZoneInfo. –

+0

¿Si no se conoce la zona horaria? para todos en diferentes países, ¿cómo podemos hacerlo? –

+0

@JhoonBey permite a las personas seleccionar su país o utilizar un servicio que determina el país desde su dirección IP. p.ej. http://stackoverflow.com/q/13921563/14033 –

0

Puede obtener el tiempo libre en el servidor y hacer esto.

DateTime myTimeGMT = ServerTime.ToUniversalTime(); 

Este hacer esto:

DateTime myTimeLocal = myTimeGMT.ToLocalTime(); 

La única restricción es que aquí el equipo que está en debe estar ajustado a la zona horaria que está convirtiendo.

En mi experiencia, .NET tiene problemas para convertir entre zonas horarias cuando ni la hora 'De' ni la hora 'Hasta' son la zona horaria local.

Espero que esto ayude.

+0

DateTime myTimeLocal = myTimeGMT.ToLocalTime(); que lo convertirá de nuevo a servertime – Nesizer

+2

Debe consultar la clase TimeZoneInfo para realizar las conversiones. La conversión que muestra es ignorante de los problemas de horario de verano. –

0

hice la conversión a visualizar en un GridView utilizando un campo de la plantilla.

<asp:TemplateField HeaderText="Last Activity"> 
       <ItemTemplate> 
        <asp:Label ID="LastActivityLBL" runat="server" Text='<%# Convert.ToDateTime(Eval("LastActivityDate")).ToLocalTime() %>'></asp:Label> 
       </ItemTemplate> 
      </asp:TemplateField> 
      <asp:TemplateField HeaderText="Last Login"> 
       <ItemTemplate> 
        <asp:Label ID="LastLoginLBL" runat="server" Text='<%# Convert.ToDateTime(Eval("LastLoginDate")).ToLocalTime() %>'></asp:Label> 
       </ItemTemplate> 
      </asp:TemplateField> 
0
Datetime localtime = DateTimeOffset.Now.ToOffset(new TimeSpan(1,0,0)).DateTime; 

Puede cambiar su TimeSpan como-

Datetime localtime = DateTimeOffset.Now.ToOffset(new TimeSpan(3,0,0)).DateTime; 

de acuerdo con la zona horaria.

Cuestiones relacionadas