2009-10-28 12 views
2

Dans le réglage de mes utilisateurs, j'ai une liste déroulante avec toutes les dates GMT pour l'utilisateur à sélectionner. En C#, comment convertir une date-heure stockée dans la base de données en heure GMT?Paramètre datetime utilisateur comme GMT, comment convertir la date en paramètre localisé?

L'heure stockée dans la base de données correspond à l'heure du serveur.

+0

Dans quel format stockez-vous les données de fuseau horaire de votre utilisateur? –

Répondre

2

Pour 3.5+ .NET, vous pouvez stocker l'identificateur de fuseau horaire du système avec l'utilisateur (vous pouvez obtenir ceux de TimeZoneInfo.GetSystemTimeZones) et utiliser TimeZoneInfo pour convertir entre les fuseaux horaires:

// In a User class that has a string timeZoneId field (for example) 
public DateTime GetLocalDateTime(DateTime originalDate) { 
    DateTime utcDate  = TimeZoneInfo.Local.ConvertToUtc(originalDate); 
    TimeZone userTimeZone = TimeZoneInfo.FindSystemTimeZoneById(this.timeZoneId); 
    return TimeZone.ConvertTime(utcDate, userTimeZone); 
} 

Dans .NET 2.0, vous êtes limité à l'ancienne classe TimeZone qui est uniquement disponible pour le système local. Vous ne recevez pas automatiquement les informations sur l'heure d'été pour l'utilisateur, vous devez donc les stocker vous-même en même temps que le décalage GMT/UTC de base.

// In a User class that has a double utcOffset field (for example) 
public DateTime GetLocalDateTime(DateTime originalDate) { 
    DateTime utcDate = TimeZone.CurrentTimeZone.ToUniversalTime(originalDate); 
    return utcDate.AddHours(this.utcOffset); 
} 

// Usage 
DateTime localDate = user.GetLocalDateTime(DateTime.Now); 
1

Je suppose que vous stockez la différence GMT pour chaque utilisateur? C'est à dire. 0 ou +1 ou -6, etc?

// Get your DateTime to convert 
DateTime databaseDateTime = DateTime.Now; 
double userGmtOffset = 1; 

// Get the GMT time of the database time 
int hoursOffset = TimeZone.CurrentTimeZone.GetUtcOffset(databaseDateTime).Hours; 
DateTime gmtDateTime = databaseDateTime.AddHours((double)(0 - hoursOffset)); 
DateTime userDateTime = gmtDateTime.AddHours(userGmtOffset); 
+0

oui datetime est l'heure interne des serveurs. – mrblah

+0

J'ai fait quelques changements donc cela devrait faire l'affaire maintenant ... Bien que je ne sois pas sûr de ce qui se passe avec l'heure d'été. Donc j'ai hâte de recevoir des commentaires. – GenericTypeTea

0

Utilisez System.DateTimeOffset au lieu de DateTime. IT comprend toutes les fonctionnalités dont vous avez besoin.