2008-11-26 10 views
8

J'ai un problème avec le temps
Mon serveur se trouve aux États-Unis et je suis au Danemark (Europe) et j'aimerais que mon site affiche l'heure à l'heure locale. Comment puis je faire ça?comment convertir l'heure du serveur à l'heure locale

J'essaie cette

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

et il fonctionne, mais il ne fonctionne que quand je suis en GMT + 1/UTC + 1 et non quand je suis en GMT + 2/UTC + 2. Existe-t-il un autre moyen de le faire - une façon plus simple de le faire?

Répondre

11

La seule façon que vous devriez le faire est la suivante:

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"); 

Utilisation de la classe TimeZoneInfo est le seul moyen fiable en .Net pour convertir à/de différents fuseaux horaires et obtenir des conversions appropriées de l'heure d'été.

TimeZoneInfo.ConvertTimeToUtc(dtLocal,tzi) est la conversion inverse d'une heure locale à une heure utc.


Pour les chaînes Id TimeZone, vous pouvez exécuter le morceau de code ici ...

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

Il convient de noter que TimeZoneInfo prend correctement en compte les différences DST pour les temps passés et futurs. Ne soyez pas tenté de faire les conversions vous-même en utilisant BaseUtcOffset ou GetUtcOffset(). Vous pouvez également rechercher des heures non valides et ambiguës à l'aide de TimeZoneInfo. –

+0

Si le fuseau horaire n'est pas connu? pour tout le monde dans différents pays, comment pouvons-nous le faire? –

+0

@JhoonBey permet aux utilisateurs de sélectionner leur pays ou d'utiliser un service qui détermine le pays à partir de leur adresse IP. par exemple. http://stackoverflow.com/q/13921563/14033 –

0

Vous pouvez obtenir le temps hors du serveur et le faire.

DateTime myTimeGMT = ServerTime.ToUniversalTime(); 

Ce faire:

DateTime myTimeLocal = myTimeGMT.ToLocalTime(); 

La seule restriction est ici l'ordinateur que vous êtes doit être réglé sur le fuseau horaire que vous convertissez. Dans mon expérience, .NET a du mal à convertir entre les fuseaux horaires lorsque ni l'heure 'De', ni l'heure 'À' ne sont le fuseau horaire local.

J'espère que cela aide.

+0

DateTime myTimeLocal = myTimeGMT.ToLocalTime(); qui le convertira en serveur – Nesizer

+2

Vous devez consulter la classe TimeZoneInfo pour effectuer les conversions. La conversion que vous montrez ignore les problèmes d'heure d'été. –

0

Je l'ai fait la conversion à afficher dans un gridview en utilisant un champ de modèle.

<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; 

Vous pouvez modifier votre TimeSpan like--

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

selon le fuseau horaire.

Questions connexes