C# 处理客户端和服务器之间仅日期日期时间的时区
我的ASP.NET Web API应用程序中有一个自定义验证属性,用于检查日期是否在将来(不允许在将来的日期)。代码如下:C# 处理客户端和服务器之间仅日期日期时间的时区,c#,datetime,asp.net-web-api,timezone,utc,C#,Datetime,Asp.net Web Api,Timezone,Utc,我的ASP.NET Web API应用程序中有一个自定义验证属性,用于检查日期是否在将来(不允许在将来的日期)。代码如下: protected override ValidationResult IsValid(object value, ValidationContext validationContext) { if (value != null) { var date = (DateTime)value; if (date != null)
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;
}
我不知道如何进行比较,所以它适用于所有时区。使用DateTime.UtcNow
不是解决方案,因为如果客户端和服务器位于同一时区,在接近午夜的几个小时内,日期将是第二天。当然,DateTime。现在
不适用于其他时区。那么,解决方案是什么
更新:
在我的WebApiConfig.cs
文件中,我有以下代码将DateTimeZoneHandling
设置为Utc
:
jsonFormatter.SerializerSettings = new JsonSerializerSettings
{
ContractResolver = new CamelCasePropertyNamesContractResolver(),
DateFormatHandling = DateFormatHandling.IsoDateFormat,
DateTimeZoneHandling = DateTimeZoneHandling.Utc
};
这将对JSON响应中的日期进行如下格式化:“2018-03-02T00:00:00Z”
而且,所有来自客户端的DateTime值都将其Kind
属性设置为Utc
。然后,我可以将日期与UtcNow
进行比较,但现在的问题是,日期“2018-03-02T00:00:00Z”在我的浏览器中显示为2018年3月1日,因为它转换为本地时间(UTC-5)。尝试以下操作:
var date = (DateTime)value;
var utcDate = date.ToUniversalTime();
而不是像这样的主持人:
if(utcDate .Date > DateTime.UtcNow.Date)
试试这个:
var date = (DateTime)value;
var utcDate = date.ToUniversalTime();
而不是像这样的主持人:
if(utcDate .Date > DateTime.UtcNow.Date)
只有两种可行的方法
date
对象。如果您的datepicker没有直接提供此值,那么可以从Date
对象创建它-手动或使用类似于moment.js的库。不要调用.toISOString()
,因为除了ISO格式之外,它还将假定您指的是当地时间午夜,并进行UTC转换
另外,不要设置JSON.Net的任何日期设置,只需使用默认值。只有两种可行的方法
date
对象。如果您的datepicker没有直接提供此值,那么可以从Date
对象创建它-手动或使用类似于moment.js的库。不要调用.toISOString()
,因为除了ISO格式之外,它还将假定您指的是当地时间午夜,并进行UTC转换
另外,不要设置JSON.Net的任何日期设置,只需使用默认值即可。var timezoneOffset=new date().getTimezoneOffset()-您可以从客户端到服务器(任何web API调用)获取此信息 在时区偏移详细信息的帮助下,您可以实现同样的效果。在我的例子中,我将UTC日期时间转换为服务器端的客户端本地日期时间
DateTime clientDateTime=DateTime.UtcNow-新的时间跨度(timezoneOffset/60,timezoneOffset%60,0)var timezoneOffset=new Date().getTimezoneOffset()-您可以从客户端到服务器(任何web API调用)获取此信息 在时区偏移详细信息的帮助下,您可以实现同样的效果。在我的例子中,我将UTC日期时间转换为服务器端的客户端本地日期时间
DateTime clientDateTime=DateTime.UtcNow-新的时间跨度(timezoneOffset/60,timezoneOffset%60,0)我对此不确定,但您可能想试试:DateTime now=DateTime.now;例如,如果(date.ToUniversalTime().date>now.ToUniversalTime().date)@EdSF,现在,在我的时区是晚上11:45。如果我在浏览器中选择2018年3月2日,并将其发布到服务器,则服务器上今天的UTC日期也将是2018年3月2日。因此,验证将通过。但是,不应该,因为今天的日期实际上还是2018年3月1日。@RavirajPalvankar我明天会试试,让你知道。你应该重新阅读你的帖子,找出w