C# WCF反序列化JSON历元格式的时间戳不正确

C# WCF反序列化JSON历元格式的时间戳不正确,c#,json,wcf,date,datetime,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() +

我有一个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)\/';
}
(来自)

调用的结果是JSON,日期字段表示如下:

/Date(1455318000000-0000)/\
WCF服务绑定日期,但方式不正确。它添加了一个偏移量,因此输入日期与输出日期不同:

13.01.2016->13.2.2016

2016年1月31日->2016年3月2日

我能理解它是否会略有不同,但一个月太大了,不可能是时区的差异。我知道日期和时间表示是一个巨大的主题,但我找不到任何简单的答案来解决这个问题

更新

我注意到dateToWcf函数产生了奇怪的历元值。在线转换器不能很好地转换它。我改成

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

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

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

是必需的。

为什么不让javascript将日期时间转换为ISO 8601标准。这样你就不必担心时区或任何事情。WCF可以很好地处理这种格式

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