【发布时间】:2016-02-03 09:31:07
【问题描述】:
我有一个带有某种方法的 WCF REST 服务:
string FooBar(Foo bar);
Foo 内部有一个 DateTime 属性。
另一方面,我有一个 Angular.js 客户端。客户端调用服务并格式化日期以适应 WCF 的需要。我使用以下函数来格式化日期:
function dateToWcf(input) {
var d = new Date(input);
if (isNaN(d)) return null;
return '\/Date(' + d.getTime() + '-0000)\/';
}
(来自here)
//Splitted date is a result of .split(".") function executed on input date in dd.MM.yyyy format
model.field = dateToWcf(new Date(splittedDate[2], splittedDate[1], splittedDate[0], 0, 0, 0));
调用的结果是JSON,日期字段表示如下:
/Date(1455318000000-0000)/\
WCF 服务绑定日期,但方式不正确。它添加了一个偏移量,因此输入的日期与输出的日期不同:
13.01.2016 -> 13.2.2016
31.01.2016 -> 2.3.2016
我会理解它是否会略有不同,但一个月太大而不能成为时区的差异。我知道日期和时间表示是一个很大的话题,但我找不到任何简单的答案来解决这个问题。
更新
我注意到 dateToWcf 函数会产生某种奇怪的 epoch 值。 This 在线转换器无法很好地转换它。我已经修改为
function dateToWcf2(dateInString, dateFormat) {
return '\/Date(' + moment.utc(dateInString, dateFormat).unix() + ')\/'
}
结果更令人沮丧。它返回正确的纪元时间戳(例如 01.01.2016 -> 1451606400),但 WCF 完全错误地转换它(01.01.2016 -> 17.01.1970)。
更新2
似乎都是关于时间戳末尾缺少三个零:
PS C:\Users\Administrator> (new-object DateTime(1970,1,1,0,0,0,0)).AddMilliseconds(1451606400)
Saturday, January 17, 1970 7:13:26 PM
PS C:\Users\Administrator> (new-object DateTime(1970,1,1,0,0,0,0)).AddMilliseconds(1451606400000)
Friday, January 1, 2016 12:00:00 AM
【问题讨论】: