【问题标题】:WCF deserializes JSON epoch formatted timestamp incorrectlyWCF 错误地反序列化 JSON 纪元格式的时间戳
【发布时间】: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

【问题讨论】:

    标签: c# json wcf date datetime


    【解决方案1】:

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

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

    Momentjs java script library 为必填项。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 2018-10-13
        • 2015-02-16
        • 1970-01-01
        • 2019-06-12
        • 2019-07-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多