ata*_*ati 0 c# timezone datetime utc asp.net-web-api
我的 ASP.NET Web API 应用程序中有一个自定义验证属性,用于检查日期是否在未来(不允许在未来的日期)。这是代码:
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
if (value != null)
{
var date = (DateTime)value;
if (date != null)
{
if(date.Date > DateTime.UtcNow.Date)
{
return new ValidationResult(FormatErrorMessage(validationContext.DisplayName), new[] { validationContext.MemberName });
}
}
}
return ValidationResult.Success;
}
Run Code Online (Sandbox Code Playgroud)
我不知道如何进行比较,因此它适用于所有时区。使用DateTime.UtcNow不是解决方案,因为如果客户端和服务器在同一个时区,在接近午夜的时间里,日期将是后一天。而且,当然DateTime.Now不适用于其他时区。那么,有什么解决办法呢?
更新:
在我的WebApiConfig.cs文件中,我有这个代码来设置DateTimeZoneHandling为Utc:
jsonFormatter.SerializerSettings = new JsonSerializerSettings
{
ContractResolver = new CamelCasePropertyNamesContractResolver(),
DateFormatHandling = DateFormatHandling.IsoDateFormat,
DateTimeZoneHandling = DateTimeZoneHandling.Utc
};
Run Code Online (Sandbox Code Playgroud)
这将格式化 JSON 响应中的日期,如下所示:“2018-03-02T00:00:00Z”。
而且,来自客户端的所有 DateTime 值都将其Kind属性设置为Utc。然后,我可以将日期与 进行比较UtcNow,但现在的问题是日期“2018-03-02T00:00:00Z”在我的浏览器中显示为 2018 年 3 月 1 日,因为它已转换为本地时间 (UTC -5) .
只有两种可行的方法。
如果您不采用这些选项,仅将客户端本地时间值传递给服务器,而没有任何偏移量或时区信息,则无法实现您的目标。服务器对客户端的时区可能是什么没有什么神奇的。
此外,如果您要比较整个日期(例如2018-03-02,不是2018-03-02T00:00:00),那么您需要决定哪个时区与您的用例相关。例如,如果您与 UTC 日进行比较,那么对于洛杉矶的企业来说,这将不会奏效,除非他们的业务流程与 UTC 保持一致。
根据我们的聊天更新:
由于您只需要处理整个日期,因此不要进行任何时区转换。确保从日期选择器中选择的日期正是发送的日期 - 而不是通过Date对象。如果您的日期选择器不直接提供此值,则从Date对象创建它- 手动或使用像 moment.js 这样的库。不要打电话,.toISOString()因为除了 ISO 格式之外,它还会假设您指的是当地时间午夜并进行 UTC 转换。
也不要设置任何 JSON.Net 的日期设置 - 只需使用默认值。
| 归档时间: |
|
| 查看次数: |
10013 次 |
| 最近记录: |