我们正在开发一个网站,目前,该网站和数据库的时区位于德国时区(欧洲标准时区)。但该应用程序也正在从美国访问。应用程序中有一个屏幕,其中包含一个名为 ValidFrom 的 DateTime 字段,我们存储的时间是 UTC 时间。目前,用户没有选择时间,因此我们使用.NET内置的 DateTime.UTCNow 将DateTime值存储在数据库中。但问题是在显示时,我们需要根据用户时区显示它。所以经过谷歌搜索几个小时后,我们发现两个解决方案一个使用时刻,另一个方法是使用 DateTime.SpecifyKind 。我们尝试使用 moment.js ,但它再次将日期时间转换为本地时间。所以我们最终使用 DateTime.SpecifyKind ,如下所示。
[DataMember]
private DateTime _validFrom;
public DateTime ValidFrom
{
get { return _validFrom; }
set { _validFrom = DateTime.SpecifyKind(value, DateTimeKind.Utc); }
}
现在根据时区显示值。但我怀疑的是,它是处理时区显示的正确方法还是存在任何其他更好的解决方案?
答案 0 :(得分: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 :(得分:1)
我为此写了一个扩展方法:
public static DateTime ConvertFromUTC(this DateTime date, TimeZoneInfo destZone)
{
var utcZone = TimeZoneInfo.FindSystemTimeZoneById("UTC");
return TimeZoneInfo.ConvertTime(date, utcZone, destZone);
}
但是,如果您计划使用此类内容,则需要注意夏令时。如果转换跨越任一时区中的DST更改,则结果可能会关闭。因此,如果您需要绝对精确度,这取决于网站,例如:它是博客还是股票交易应用程序,它是不是真的合适?