Angularjs,Datepicker 落后一天

Posted

技术标签:

【中文标题】Angularjs,Datepicker 落后一天【英文标题】:Angularjs, Datepicker one day beind 【发布时间】:2014-03-19 10:22:42 【问题描述】:

我了解日期选择器(我正在使用 AngularStrap's datepicker)由于 javascript 中日期的计算方式而“落后”了一天。我的问题是,我如何让它不考虑时区而只坚持输入的日期......没有调整?

我在日期选择器中选择了 2014 年 2 月 1 日。我在屏幕上的值是 2/1/2014,我希望保存该值。但是,日期选择器将其转换为 Fri Jan 31 2014 19:00:00 GMT-0500 (EST) 显然是因为它从输入的日期中减去了我的时区的 5 小时。我不想要这个。如果我输入 2/1/2014,我想要那个日期,无论时区如何。

拦截/更改/编辑此值的最佳方法,以便进入2/1/2014给了我的日期......不转换时区?我是否应该修改 datepicker 代码本身(这似乎是个坏主意)?如果通过添加某种偏移量,我应该在向后端发送到后端之前更改价值吗?如果是这样,您如何为控制台显示为Fri Jan 31 2014 19:00:00 GMT-0500 (EST) 的值添加时间?

【问题讨论】:

【参考方案1】:

我用自定义指令https://gist.github.com/weberste/354a3f0a9ea58e0ea0de解决了这个问题

它适用于 Angular Bootstrap datepicker,但我想它也应该适用于 AngularStrap datepicker,因为它只依赖于相应的 ngModel 而不是 datepicker 本身。

本质上,每当在日期选择器上选择日期(此值是 yyyy-mm-dd 格式的字符串,将存储在模型上)以及访问模型以填充视图时,我都会重新格式化该值,我需要再次将它包装在 Date 对象中,以便 datepicker 正确处理它。

换句话说,它正在执行您在问题中要求的拦截。

【讨论】:

你能在上下文中展示这个要点吗?遇到了同样的问题,但你的指令对我不起作用。【参考方案2】:

我知道这个帖子有点老了,但由于没有公认的解决方案,我想我会提供 final 在经过大量的混乱之后对我有用的东西:

我的问题是日期选择器使用了错误的时区,所以当我尝试编辑事件时,即使正确的日期存储在数据库中,也会显示错误的日期。以下为我修复了它:

 var evDate = new Date(data.eventDate); //data.eventDate is the date string
 evDate.setMinutes(evDate.getMinutes() + evDate.getTimezoneOffset()); 

 $scope.eventInfo.eventDate = evDate;

我在这里找到了这个解决方案:https://github.com/angular-ui/bootstrap/issues/2628

【讨论】:

【参考方案3】:

如果您不介意加载其他资源,那么我建议您使用 MomentJS,因为它可以消除 JavaScript 中日期的痛苦。您可以执行类似 `moment(datepicker value).local()' 的操作来获取没有时区偏移的日期。

http://momentjs.com/docs/#/manipulating/local/

【讨论】:

这行不通,因为我已经只向日期选择器提供了月份和年份的值。我不提供时区,它会自动执行此操作,这就是问题所在。例如,日期选择器看到 2/1/14 并将其转换为 2014 年 2 月 1 日 00:00:00,然后从中减去我的时区,得到 2014 年 1 月 28 日 19:00:00。从一开始就将值传递给它不会解决这个问题。 日期选择器的模型返回的值与您输入的值不同,那么为什么不在发送到后端之前使用 momentJS 进行调整?【参考方案4】:

我找到了办法。首先将该日期转换为字符串。这是代码。

 var SelectDate = $scope.GetFormattedDate(Date.parse($("#Date").datepicker("getDate")));            
     $scope.GetFormattedDate = function (CalDate) 
            var re = /-?\d+/;
            var WDate = CalDate.toString();
            var m = re.exec(WDate);
            var lastDate = new Date(parseInt(m[0]));
            var mm = lastDate.getMonth() + 1;
            var dd = lastDate.getDate();
            var yyyy = lastDate.getFullYear();
            var formattedDate = mm + '/' + dd + '/' + yyyy;

            return formattedDate;
        

现在将 SelectDate 传递给您的控制器。宾果问题已解决:)

【讨论】:

【参考方案5】:

如果您遇到此问题,可能是因为您正在重新将数据放入 boostrap 日期选择器中。此解决方案对我有用。 首先检查日期是否为空

dateBegin===null?dateBegin=null:dateBegin = new Date(formatDate(dateBegin,'yyyy-MM-dd','en'));

**如果为 null,您将其值设置为 null,您将在表单组和表单组控件中放入该值

this.ugovorForm = new FormGroup('dateBegin':new FormControl(dateBegin))

否则,您将使用 Angular 提供的 formatDate 属性设置日期并对其进行格式化。我一直在努力解决这个问题。这是因为我正在从数据库加载日期。祝你好运;

【讨论】:

以上是关于Angularjs,Datepicker 落后一天的主要内容,如果未能解决你的问题,请参考以下文章

带有引导程序 ui-datepicker 的 Angularjs

Angularjs 中的 ng-datepicker

Datepicker 不与控制器反应 - AngularJS

AngularJS:Datepicker 指令如何在占位符中有今天的日期

AngularJS Material Datepicker 更改格式

如何在angularjs-datepicker中获得hh:mm:ss