用户日期时间设置为GMT,如何将日期转换为其本地化设置?

问题描述:

在我的用户设置中,我有一个包含所有GMT日期的下拉列表供用户选择。用户日期时间设置为GMT,如何将日期转换为其本地化设置?

在c#中,我将如何将存储在数据库中的日期时间转换为GMT时间?

存储在数据库中的时间是服务器时间。

+0

您以何种格式存储用户的时区数据? – 2009-10-28 13:22:44

对于.NET 3.5+,你可以在系统时区标识符存储与用户(您可以得到那些来自TimeZoneInfo.GetSystemTimeZones),并使用TimeZoneInfo在时区之间转换:

// 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); 
} 

在.NET 2.0,您仅限于较旧的TimeZone类,该类仅适用于本地系统。您不会自动为用户获取夏令时信息,因此您必须将自己的时间与基本的GMT/UTC偏移量一起存储。

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

我把它存储每个用户的GMT差异?即0或+1或-6等?

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

yes datetime是服务器时间interally。 – mrblah 2009-10-28 13:18:08

+0

我做了一些改变,所以现在应该做的伎俩......虽然我不知道夏令时会发生什么。所以我期待反馈。 – GenericTypeTea 2009-10-28 13:21:11

使用System.DateTimeOffset而不是DateTime。 IT包括您需要的所有功能。