所以我试图用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">
它们在您输入日期后都会绑定并转换并减少一天的日期。
答案 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的角度,这样可以更容易地避免存储日期的自动时区转换。