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

标签 c# asp.net .net asp.net-mvc datetime

我们正在开发一个网站,目前网站和数据库的时区是德国时区(欧洲标准时区)。但是该应用程序也可以从美国访问。应用程序中有一个屏幕,其中包含一个名为 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); }
} 

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

最佳答案

我会改用 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/

相关文章:

c# - 类似sql的查询不起作用

c# - 使用 asp.net web api 和 knockout js 处理图像上传的输入表单

c# - EF 核心 : Cannot insert explicit value for identity column in table when IDENTITY_INSERT is set to OFF on one to many

javascript - 从JS中的选择列表中获取值

c# - 从 ASP.NET Web 服务中删除了 WebMethod,方法仍然显示

.net - 在 Windows 10 IOT 上运行的 .net Core 3 可以与 WPF 一起使用吗?

c# - 是否可以在创建 Autofac LifetimeScope 后向其添加注册?

c# - 将项目添加到 DataBound 下拉列表

asp.net - 将 Windows 身份验证与 ASP.NET MVC 结合使用

.net - 保持 Sitecore Lucene 索引最新