首页 文章

正确的转换日期时间时区以进行显示的方法

提问于
浏览
4

我们正在开发一个网站,目前,该网站和数据库的时区是德国时区(欧洲标准时区) . 但该应用程序也正在从美国访问 . 应用程序中有一个屏幕,其中包含一个名为 ValidFromDateTime 字段,我们存储的时间是 UTC 时间 . 目前,用户没有选择时间,因此我们使用.NET内置 DateTime.UTCNow 将DateTime值存储在数据库中 . 但问题是在显示时,我们需要根据用户时区显示它 . 所以经过谷歌搜索几个小时后,我们找到了两个使用 moment 的解决方案,另一个方法是使用 DateTime.SpecifyKind . 我们尝试使用 moment.js ,但它再次将日期时间转换为本地时间 . 所以我们最终使用 DateTime.SpecifyKind 如下 .

[DataMember]
private DateTime _validFrom;
public DateTime ValidFrom
{
    get { return _validFrom; }
    set { _validFrom = DateTime.SpecifyKind(value, DateTimeKind.Utc); }
}

现在,值根据时区显示 . 但我怀疑的是,它是处理时区显示的正确方法还是存在任何其他更好的解决方案?

2 回答

  • 3

    我会使用 DateTimeOffset ,例如:

    var utc = DateTimeOffset.UtcNow;
    var tz = TimeZoneInfo.FindSystemTimeZoneById("Your Specific Time Zone Id");
    var zonedDateTime = TimeZoneInfo.ConvertTime(utc, tz);
    

    将UTC和用户的时区保存在数据库中,并在您希望向用户显示时将UTC转换为特定时区 . 我还建议你看看NodaTime,如果你想做任何严肃的日期和时间 . .Net中的内置DateTime具有误导性 .

  • 1

    我为此写了一个扩展方法:

    public static DateTime ConvertFromUTC(this DateTime date, TimeZoneInfo destZone)
    {
        var utcZone = TimeZoneInfo.FindSystemTimeZoneById("UTC");
        return TimeZoneInfo.ConvertTime(date, utcZone, destZone);
    }
    

    但是,如果您打算使用这样的东西,您需要注意夏令时 . 如果转换跨越任一时区中的DST更改,则结果可能会关闭 . 因此,如果您需要绝对精确度,这取决于网站,例如:它是博客还是股票交易应用程序?

相关问题