如何在服务器中处理用于发布目的的日期
how to handle date for posting purposes in the server
我从 ASP.NET MVC /Date(1446393600000)/
中得到这个值,它在 SQL 数据库中的值是 '2015-11-02'
,这是一个 date
(仅限日期)和为了将它作为 javascript 对象进行操作,我使用了 moment.js,所以当用作 moment('/Date(1446393600000)/')
时,我得到了这个结果 "2015-11-01T16:00:00.000Z"
所以这段代码:
bindingHandler可以找到here
ko.bindingHandlers.datepicker = {
init: function(element, valueAccessor, allBindingsAccessor) {
var options = allBindingsAccessor().datepickerOptions || {},
$el = $(element);
//initialize datepicker with some optional options
$el.datepicker(options);
//handle the field changing
ko.utils.registerEventHandler(element, "change", function() {
var observable = valueAccessor();
observable(moment($el.datepicker("getDate"))); // I added moment function here
});
//handle disposal (if KO removes by the template binding)
ko.utils.domNodeDisposal.addDisposeCallback(element, function() {
$el.datepicker("destroy");
});
}
/*,
update: function(element, valueAccessor) {
var value = ko.utils.unwrapObservable(valueAccessor()),
$el = $(element),
current = $el.datepicker("getDate");
if (value - current !== 0) {
$el.datepicker("setDate", value);
}
}*/
};
var vm = {
sampleDate: ko.observable(moment('/Date(1446393600000)/')), // I added moment function here
originalValue: '/Date(1446393600000)/', // For reference only
FromSqlDb: '2015-11-02' // For reference only
};
vm.formattedDate = ko.pureComputed(function() {
return this.sampleDate() ?
this.sampleDate().format("ddd, DD MMM YYYY") :
'';
}, vm);
ko.applyBindings(vm);
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.10.6/moment.min.js"></script>
<link href="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.11.4/jquery-ui.min.css" rel="stylesheet" />
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="//code.jquery.com/ui/1.11.4/jquery-ui.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script>
<input type="text" data-bind="datepicker: sampleDate" /> <br />
<pre data-bind="text: ko.toJSON($root, null, 2)"></pre>
如您所见,当我在其上使用 moment()
时,值 2015-11-02
现在已转换为 UTC "2015-11-01T16:00:00.000Z"
。这是我不想要的,因为我想保留我从 db
得到的东西
所以我的问题是:
- momentjs 是否总是将您的日期转换为其 utc?
- 当我尝试
post
sampleDate
时出现此错误。
我的临时解决方案是 post
computed
变量。 (formattedDate
有效)
请帮我理解错误发生的原因。非常感谢任何帮助!
日期是你选择的。使用 moment 的 toDate
,你会得到一个具有预期值的 js Date 对象。您看到的是 UTC 表示,即转换为 Z 区(子午线 0 或格林里奇子午线)的同一小时。
根据 OP 评论,日期是使用 .toISOString()
发布的。在这种情况下,如果您所在的时区不是 Z(格林威治子午线),则日期将参考之前的日期。例如日期2015-04-20 GMT+1
,将被格式化为2015-04-19T23:00:00.000Z
,服务器将裁剪时间和时区信息,因此它会比所需日期早一天。
为了避免 2. 中的问题,我们可以指示 moment 将日期解析为 UTC 日期,如下所示:moment.utc('datestring')
。例如,执行 moment.utc('2015-03-11')
将创建日期 2015-03-11T00:00:00.000Z
,因此对 ISO 字符串的转换将提供所需的日期。在这种情况下,您必须更改这行代码:
observable(moment($el.datepicker("getDate")))
到
observable(moment.utc($el.datepicker("getDate")))
我从 ASP.NET MVC /Date(1446393600000)/
中得到这个值,它在 SQL 数据库中的值是 '2015-11-02'
,这是一个 date
(仅限日期)和为了将它作为 javascript 对象进行操作,我使用了 moment.js,所以当用作 moment('/Date(1446393600000)/')
时,我得到了这个结果 "2015-11-01T16:00:00.000Z"
所以这段代码:
bindingHandler可以找到here
ko.bindingHandlers.datepicker = {
init: function(element, valueAccessor, allBindingsAccessor) {
var options = allBindingsAccessor().datepickerOptions || {},
$el = $(element);
//initialize datepicker with some optional options
$el.datepicker(options);
//handle the field changing
ko.utils.registerEventHandler(element, "change", function() {
var observable = valueAccessor();
observable(moment($el.datepicker("getDate"))); // I added moment function here
});
//handle disposal (if KO removes by the template binding)
ko.utils.domNodeDisposal.addDisposeCallback(element, function() {
$el.datepicker("destroy");
});
}
/*,
update: function(element, valueAccessor) {
var value = ko.utils.unwrapObservable(valueAccessor()),
$el = $(element),
current = $el.datepicker("getDate");
if (value - current !== 0) {
$el.datepicker("setDate", value);
}
}*/
};
var vm = {
sampleDate: ko.observable(moment('/Date(1446393600000)/')), // I added moment function here
originalValue: '/Date(1446393600000)/', // For reference only
FromSqlDb: '2015-11-02' // For reference only
};
vm.formattedDate = ko.pureComputed(function() {
return this.sampleDate() ?
this.sampleDate().format("ddd, DD MMM YYYY") :
'';
}, vm);
ko.applyBindings(vm);
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.10.6/moment.min.js"></script>
<link href="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.11.4/jquery-ui.min.css" rel="stylesheet" />
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="//code.jquery.com/ui/1.11.4/jquery-ui.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script>
<input type="text" data-bind="datepicker: sampleDate" /> <br />
<pre data-bind="text: ko.toJSON($root, null, 2)"></pre>
如您所见,当我在其上使用 moment()
时,值 2015-11-02
现在已转换为 UTC "2015-11-01T16:00:00.000Z"
。这是我不想要的,因为我想保留我从 db
所以我的问题是:
- momentjs 是否总是将您的日期转换为其 utc?
- 当我尝试
post
sampleDate
时出现此错误。
我的临时解决方案是 post
computed
变量。 (formattedDate
有效)
请帮我理解错误发生的原因。非常感谢任何帮助!
日期是你选择的。使用 moment 的
toDate
,你会得到一个具有预期值的 js Date 对象。您看到的是 UTC 表示,即转换为 Z 区(子午线 0 或格林里奇子午线)的同一小时。根据 OP 评论,日期是使用
.toISOString()
发布的。在这种情况下,如果您所在的时区不是 Z(格林威治子午线),则日期将参考之前的日期。例如日期2015-04-20 GMT+1
,将被格式化为2015-04-19T23:00:00.000Z
,服务器将裁剪时间和时区信息,因此它会比所需日期早一天。
为了避免 2. 中的问题,我们可以指示 moment 将日期解析为 UTC 日期,如下所示:moment.utc('datestring')
。例如,执行 moment.utc('2015-03-11')
将创建日期 2015-03-11T00:00:00.000Z
,因此对 ISO 字符串的转换将提供所需的日期。在这种情况下,您必须更改这行代码:
observable(moment($el.datepicker("getDate")))
到
observable(moment.utc($el.datepicker("getDate")))