C# 处理客户端和服务器之间仅日期日期时间的时区

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)

我的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;
}
我不知道如何进行比较,所以它适用于所有时区。使用
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)

只有两种可行的方法

  • 在将值发送到服务器进行比较之前,在客户端上转换为UTC
  • 尝试确定客户机的时区id(如果仅针对单个时间点,则为偏移量),并将其从客户机传递到服务器。然后,服务器可以使用该信息在比较之前转换为UTC
  • 如果您不使用这两个选项,只向服务器传递客户端本地时间值,而不传递任何偏移量或时区信息,则无法实现您的目标。对于客户端的时区,服务器没有任何魔力

    此外,如果您要比较整个日期(例如2018-03-02,而不是2018-03-02T00:00:00),则需要确定与您的用例相关的时区。例如,如果您将其与UTC日进行比较,则这对于洛杉矶的企业来说将不会很好地起作用,除非他们将其业务流程与UTC相一致

    根据我们的聊天记录更新:

    因为您只需要处理整个日期,所以不要进行任何时区转换。确保从日期选择器中选择的日期与发送的日期完全一致,而不是通过
    date
    对象。如果您的datepicker没有直接提供此值,那么可以从
    Date
    对象创建它-手动或使用类似于moment.js的库。不要调用
    .toISOString()
    ,因为除了ISO格式之外,它还将假定您指的是当地时间午夜,并进行UTC转换


    另外,不要设置JSON.Net的任何日期设置,只需使用默认值。

    只有两种可行的方法

  • 在将值发送到服务器进行比较之前,在客户端上转换为UTC
  • 尝试确定客户机的时区id(如果仅针对单个时间点,则为偏移量),并将其从客户机传递到服务器。然后,服务器可以使用该信息在比较之前转换为UTC
  • 如果您不使用这两个选项,只向服务器传递客户端本地时间值,而不传递任何偏移量或时区信息,则无法实现您的目标。对于客户端的时区,服务器没有任何魔力

    此外,如果您要比较整个日期(例如2018-03-02,而不是2018-03-02T00:00:00),则需要确定与您的用例相关的时区。例如,如果您将其与UTC日进行比较,则这对于洛杉矶的企业来说将不会很好地起作用,除非他们将其业务流程与UTC相一致

    根据我们的聊天记录更新:

    因为您只需要处理整个日期,所以不要进行任何时区转换。确保从日期选择器中选择的日期与发送的日期完全一致,而不是通过
    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