【发布时间】:2019-08-11 14:12:18
【问题描述】:
我有一个视图模型,其中一个属性是DateTime。我想允许请求者在他们想要的任何时区发送 DateTime。最后,我想将该日期时间转换为 UTC,如果时区信息没有随日期到达,则假设它是 UTC。
或者,我可以将发布的 DateTime 限制为 UTC 或至少包含时区信息的内容。
我的后端使用 UTC 格式的所有日期,以 UTC 格式返回它们,这也是它的保存方式。这个问题是关于接收“客户”输入以及接受日期并将其转换为或确保其为 UTC 的最佳做法。
这就是我现在拥有的
public class MyViewModel
{
/// <summary>
/// Start date, in UTC.
/// </summary>
[Required]
[DataType(DataType.Date)]
public DateTime StartDate { get; set; }
}
在控制器中:
// Convert to UTC
model.StartDate = model.StartDate.ToUniversalTime();
我想我也可以通过添加构造函数在视图模型本身中做到这一点。
通过视图模型接收DateTime 输入的最佳做法是什么?最终,我想确保我收到的是 UTC。
【问题讨论】:
-
这真的取决于一个项目一个项目的基础。如果您的方法始终如一,我已经看到它以各种方式完成并且您正在做的事情很好。
-
全局设置
DateTimeZoneHandling.Utc。可能是你需要的。考虑到 JSON 日期时间字符串中的任何显式时区偏移,它在反序列化期间转换为 UTC。 -
@dbc “考虑到 JSON 日期时间字符串中的任何显式时区偏移” - 意思是如果字符串中有时区,它不会覆盖它,对吧?
-
意味着它将使用字符串中的时区转换为UTC,同时考虑到提供的时区。请参阅 Can you tell JSON.Net to serialize DateTime as Utc even if unspecified? 或者,我想您可以在模型中创建一个合成的
DateTimeOffset属性,然后在 setter 中自己进行转换。 -
马上要说明的一点:
DateTime.ToUniversalTime应该永远在网络应用程序中使用。它将从服务器的本地时区转换为UTC。
标签: c# datetime asp.net-web-api json.net