角度日期舍入$格式

时间:2015-01-05 21:09:56

标签: angularjs mongodb angularjs-directive mongoose

所以我试图用mongodb / mongoose / angular处理日期。

我试图将其用作日期选择器。但它需要yyyy-MM-dd格式。由mongoose模式生成的日期:

created: {
    type: Date,
    default: Date.now
},

这些日期是这种格式:2014-12-13T22:23:20.633Z

因此,当需要转换时,我查看了人们如何处理与数据模型的绑定。

我想出了以下指令。

'use strict';

angular.module('clients').directive('mongooseDateFormat', ['$filter',
function ($filter) {
    return {
        require: 'ngModel',
        link: function (scope, element, attrs, ngModelController) {
            ngModelController.$parsers.push(function (data) {
                console.log(data);
                data = $filter('date')(data, 'yyyy-MM-dd');
                console.log(data);
                return data; //converted
            });

            ngModelController.$formatters.push(function (data) {
                console.log(data); // gets 2015-01-12T00:00:00.000Z
                data = $filter('date')(data, 'yyyy-MM-dd');
                console.log(data); // converts to 2015-01-11
                return data; //converted
            });
        }
    };

} ]);

所以我包含了console.log函数,我在这里测试了值,并在代码中显示了注释中的一些示例日期。

您可以看到2015-01-12T00:00:00.000Z成为2015-01-11。

因此,发送到过滤器的值带有0时间戳,$ format(日期)(数据,“yyyy-MM-dd”)命令会删除时间戳,但会更改日期。

(..叹气......删除了咒骂)

对于不得不关心日期格式的新手来说,这简直令人兴奋。问题是我没有使用时区吗?我的意思是,mongodb和mongoose没有产生时区?当您尝试格式化时,为什么将零时间的日期舍入到上一个日期?

我可以继续抱怨这有多奇怪,当有人告诉我简单的答案时,让自己听起来很愚蠢。我会发帖,看看是否有人知道。

<input type="text" data-mongoose-date-format data-ng-model="client.mydate">

<input type="date" data-mongoose-date-format data-ng-model="client.mydate">

它们在您输入日期后都会绑定并转换并减少一天的日期。

2 个答案:

答案 0 :(得分:0)

这是因为时间字符串末尾的Z表示这是UTC,日期过滤器会将日期转换为您当地的时区。如果您使用Angularjs 1.3。*,则可以添加时区参数:

$filter('date')(data, 'yyyy-MM-dd', 'UTC');

答案 1 :(得分:0)

我也使用了meanjs.org样板,我现在已经尝试了几个小时来解决同样的问题。我将它存储为日期,但由于上述格式错误,无法将其与ng-model一起使用。所以我创建了上面的指令,但是如果我不想让它自动减去8小时,我发现需要使用angular 1.3来获得$ filter的时区参数。但是我发现将角度升级到1.3真的很痛苦,因为很多其他的东西都破了,所以我决定恢复到1.2而不是跟着兔子洞。

但是,我没有欺骗你,我只能通过在我的服务器模型中将mongoose数据类型从Date更改为String来绕过整个问题。这消除了自动时区转换,但仍允许您在数据绑定中使用日期过滤器。

{{show.date | date: 'mediumDate'}} 尽管作为字符串存储在mongo中,它仍然可以完美地格式化,而不会进行令人烦恼的自动时区转换。

此外,当日期存储为字符串时,在编辑表单中使用时,根本不需要任何转换。

<input type="date" data-ng-model="show.date" id="date" class="form-control" placeholder="Show date" required> 工作得很好,你不需要指令。

我从数据架构的角度来看,将日期存储为Date类型总是比较好。但是,对我来说,这是一个更简单的解决方案,直到样板开始出现角度为1.3的角度,这样可以更容易地避免存储日期的自动时区转换。