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 对象