Angular UI datepicker 的日期错误

Posted

技术标签:

【中文标题】Angular UI datepicker 的日期错误【英文标题】:Angular UI datepicker is getting wrong date 【发布时间】:2016-06-09 15:45:45 【问题描述】:

我正在Angular 中编写一个应用程序,并且我正在使用Angular UI 连同它。我有一个看起来像这样的日期选择器:

<input type="text" 
       ng-required="true"
       name="targetDate"
       uib-datepicker-popup="MMMM yyyy" 
       min-mode="'month'" 
       datepicker-mode="'month'"
       is-open="opened" 
       ng-click="openCalendar()"
       close-on-date-selection="true"
       show-button-bar="false" 
       min-date="today"
       ng-model="targetDate"  />

问题是,例如,当我选择 2016 年 7 月时,我的 targetDate 模型中的值是“2016-06-30T21:00:00.000Z”,正好是 2016 年 7 月之前的 3 小时。我认为这与我的本地时间和 UTC 时间有关,因为我住在一个本地时间为 +2 小时 UTC 的地区,但我不知道为什么会发生这种情况以及如何解决它。有什么想法吗?

【问题讨论】:

您需要使用 MomentJs 库 momentjs.com/docs 将 UTC 转换为本地时间。如果您已经知道 momentjs,请阅读 abt for Quick digitoffee.com/programming/get-local-time-utc-using-moment-js/… momentjs.com/docs 从头开始​​使用 这个问题之前已经提到过:***.com/questions/22623872/… 对我不起作用 :) 【参考方案1】:

你可以参考这个帖子-GitHub

尝试更改您的机器时区,因为 Date obj 默认选择您机器的本地时间。

或者尝试通过 getTime() 将 Date 对象解析为毫秒(如果值),然后将 10800000 毫秒添加到日期模型中,即 3 小时。

因此,您的新日期模型将是您选择的(以毫秒为单位)+ 10800000 = 所需的 UTC 日期。

【讨论】:

你真的建议用户改变他们的本地时间只是因为应用想要在 UTC 时间显示一些东西吗? 临时解决方案,将日期对象模型转换为毫秒并加上10800000(3小时) 所以您的新日期模型将是您选择的(以毫秒为单位)+ 10800000 = 所需的 UTC 日期。 我不推荐。只为暂时的缘故。请给我们建议一个永久的解决方案先生!【参考方案2】:

这实际上解决了我的问题,这是我的代码:

    service.ConvertDateToJSONDate = function (dateInput) 
        if (dateInput === null || dateInput === undefined) 
            return null;
        
        //return "\/Date(" + dateInput.getTime().toString() + ")\/";
        return "\/Date(" + (dateInput.getTime() + 10800000).toString() + ")\/";
    ;

用法:service.ConvertDateToJSONDate(SelectedDateObjectToBeConverted);

【讨论】:

【参考方案3】:

如果您只使用日期(不关心时间),您可能希望尽早将其转换为当地午夜。需要构造函数是使用类而不是模型接口的一个很好的理由,恕我直言。然后你就可以把这些乱七八糟的东西放在一个地方,而不是在你的代码中乱扔转换。

export class MyModel 

  // The runtime can still assign a string to Date, despite static type.
  date: Date;

  constructor(data: MyModel) 
    Object.assign(this, data);

    // Convert string e.g. '2008-12-25' to Date at local midnight.
    if (typeof this.date === 'string') 
      const localDate = new Date(this.date);
      this.date = new Date(localDate.getTime() + localDate.getTimezoneOffset() * 60000);
      console.log(this.date);
    
  

【讨论】:

以上是关于Angular UI datepicker 的日期错误的主要内容,如果未能解决你的问题,请参考以下文章

angular-UI datepicker 在控制器中应用日期过滤器

angular-ui datepicker datepicker 的初始状态不是按 datepicker-popup 格式化的

加载 Angular UI Bootstrap Datepicker 时将日期字符串解析为 Date 对象

javascript 不能正确地将 angular ui datepicker 日期转换为 UTC

定位 Angular UI 引导程序 Datepicker

Kendo UI for Angular:Kendo UI Datepicker 禁用输入/仅文本框部分