2

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

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

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

4

3 回答 3

2

对于 .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);
于 2009-10-28T13:33:04.917 回答
1

我认为您正在为每个用户存储 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);
于 2009-10-28T13:11:09.970 回答
0

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

于 2009-10-28T13:27:31.257 回答