我们正在开发一个网站,目前网站和数据库的时区是德国时区(欧洲标准时区)。但是该应用程序也可以从美国访问。应用程序中有一个屏幕,其中包含一个名为 ValidFrom 的 DateTime 字段,我们存储的时间是 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); }
}
现在这些值是根据时区显示的。但我的疑问是,这是处理时区显示的正确方法还是存在任何其他更好的解决方案?
最佳答案
我会改用 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 具有误导性。
关于c# - 转换日期时间时区以进行显示的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46690790/