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

user datetime setting as GMT, how to convert date to their localized setting?

在我的用户设置中,我有一个下拉列表,其中包含用户可以选择的所有GMT日期。

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

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


对于.NET 3.5+,您可以将用户存储系统时区标识符(可以从TimeZoneInfo.GetSystemTimeZones获取)并使用TimeZoneInfo在时区之间进行转换:

1
2
3
4
5
6
// 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偏移量一起存储。

1
2
3
4
5
6
7
8
// 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等?

1
2
3
4
5
6
7
8
// 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);


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