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

Posted

技术标签:

【中文标题】用户日期时间设置为 GMT,如何将日期转换为其本地化设置?【英文标题】:user datetime setting as GMT, how to convert date to their localized setting? 【发布时间】:2010-12-10 20:44:02 【问题描述】:

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

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

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

【问题讨论】:

您以什么格式存储用户的时区数据? 【参考方案1】:

对于 .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);

【讨论】:

【参考方案2】:

我认为您正在为每个用户存储 GMT 差异? IE。 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);

【讨论】:

我已经进行了一些更改,所以现在应该可以解决问题了...尽管我不确定夏令时会发生什么。所以我期待反馈。【参考方案3】:

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

【讨论】:

以上是关于用户日期时间设置为 GMT,如何将日期转换为其本地化设置?的主要内容,如果未能解决你的问题,请参考以下文章

将 GMT 日期时间转换为本地时区日期时间

如何将本地日期转换为 GMT [重复]

将 GMT+ 日期转换为 android 上的本地日期

无法使用 Java 8 将给定的本地日期转换为 GMT 日期 [重复]

如何使用js将UTC日期转换为本地时间? [复制]

NSDate - 将日期转换为 GMT