WCF错误地反序列化JSON epoch格式的时间戳

时间:2016-02-03 09:31:08

标签: c# json wcf date datetime

我有一个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 - > 2016年2月13日

     

31.01.2016 - > 2016年3月2日

我知道它是否略有不同,但是一个月太大而不能成为时区的差异。我知道日期和时间表示是一个很大的主题,但我找不到这种行为的简单答案。

更新

我注意到dateToWcf函数产生了某些奇怪的纪元值。 This在线转换器无法很好地转换它。我已修改为

function dateToWcf2(dateInString, dateFormat) {
    return '\/Date(' + moment.utc(dateInString, dateFormat).unix() + ')\/'
}

结果更令人沮丧。它返回正确的纪元时间戳(例如01.01.2016 -> 1451606400),但WCF完全错误地将其翻译(01.01.2016 -> 17.01.1970)。

UPDATE2

在时间戳结束时似乎是三个缺失的零:

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

2 个答案:

答案 0 :(得分:0)

问题不是WCF而是java脚本。有各种表示时间戳的方法。将此任何格式的日期从输入转换为WCF可接受的形式的正确方法是此函数:

function convertDateToWCFFormat(dateInString, dateFormat) {
        var noTimezone = '-0000';
        return '\/Date(' + moment.utc(dateInString, dateFormat).valueOf() + noTimezone + ')\/';
    }

Momentjs java script library是必需的。

答案 1 :(得分:0)

为什么不让你的javascript将DateTime转换为ISO 8601标准。这样你就不必担心时区或任何事情。 WCF处理这种格式就好了!

function dateToWcf(input) {
    var d = new Date(input);
    if (isNaN(d)) return null;
    return d.toISOString(); // ISO 8601 format
}