在Javascript中设置默认的DateTimeOffset

时间:2017-03-12 04:07:10

标签: javascript visual-studio-lightswitch datetimeoffset lightswitch-2013

我们假设我有一个名为' 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客户端中的数据输入,当用户创建新订单时,我希望默认情况下将OrderDate设置为今天创建的'实体的事件,如下所示:

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

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

以下是我的三个问题:

  1. 如果客户位于东亚的某个地方(例如清晨的某个地方)星期一,但服务器在美国还在星期天?
  2. 属性' OrderDate&#39 ;?的正确数据类型是什么?它应该是DateTimeOffset还是只适用于Date?
  3. 如果类型是DateTimeOffset,那么设置' OrderDate'的正确方法是什么? javascript中的属性
  4. 感谢帮助,

    祝福

1 个答案:

答案 0 :(得分:1)

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

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请求检索用户的浏览器语言,以本地时区和特定于文化的短格式显示验证消息的日期。