在 Javascript 中设置默认 DateTimeOffset

Setting default DateTimeOffset in Javascript

假设我有一个名为 'Order' 的实体,有一个名为 'OrderDate' 的 属性。在服务器上的保存管道中,我有这样的验证逻辑:

partial void Orders_Validate(Order entity, EntitySetValidationResultsBuilder results) {
    if(entity.OrderDate > DateTime.Today)
             results.AddPropertyError(
                "Please specify a date that is not in the future",
                entity.Details.Properties.OrderDate);
}

为了简化 HTML 客户端中的数据输入,当用户创建一个新订单时,我想在实体的 'created' 事件中默认将 OrderDate 设置为今天,像这样:

myapp.Order.created = function (entity) {
    entity.OrderDate = new Date();
    entity.OrderDate.setHours(0, 0, 0, 0);
};

只要服务器和客户端处于同一时区,就可以正常工作。

这是我的三个问题:

  1. 如果客户在东亚的某个地方,例如凌晨,这是否也有效?星期一但服务器在美国,那里还是星期天?
  2. 属性 'OrderDate' 的正确数据类型是什么?它应该是 DateTimeOffset 还是仅适用于 Date?
  3. 如果类型是 DateTimeOffset,在 javascript
  4. 中设置 'OrderDate' 属性 的正确方法是什么

感谢帮助,

祝福

来自 LightSwitch 团队的以下博客 post 提供了一些关于处理不同时区的最佳实践的有用背景:

What Time Is It? Global Time (Steve Lasker)

基于此,您可以将 OrderDate 字段定义为 DateTimeOffset,并按照建议将其默认设置在 JavaScript 客户端上,例如:

myapp.Order.created = function (entity) {
    entity.OrderDate = new Date();
    entity.OrderDate.setHours(0, 0, 0, 0);
};

然后,当您使用 DateTimeOffset 时,它应该使用适当的时区偏移存储客户端值,从而允许您在验证中实施以下类型的方法:

partial void Orders_Validate(Order entity, EntitySetValidationResultsBuilder results) {
    if (entity.OrderDate.Date > DateTimeOffset.Now.Date) {
        var languages = HttpContext.Current.Request.UserLanguages;
        // As the browser's language may not be set, 
        // the following falls back to the server's current culture info
        var ci = languages != null && languages.Length > 0 ? 
            new System.Globalization.CultureInfo(languages[0]) : 
            System.Globalization.CultureInfo.CurrentCulture;
        results.AddPropertyError(
            String.Format(
                "The date {0} is invalid, please specify a date that is not in the future",
                entity.OrderDate.ToLocalTime().Date.ToString("d", ci)),
            entity.Details.Properties.OrderDate);
    }
}

为了以防万一,上面的示例通过使用 ToLocalTime 并通过用户当前的 HTTP 请求检索用户的浏览器语言,以本地时区和文化特定的短格式显示验证消息的日期。