5

我正在使用 AJAX 调用将值推入 ko.observalbeArray,我想在将 JSON 返回日期格式化为“YYYY-MM-DD”之前将其推入我的 observableArray。

我要转换的代码中的特定元素是: OrderTimeStamp: element.OrderTimeStamp 这是从服务器返回的日期示例:

/日期(1377200468203+0200)/

这是我的 AJAX 调用:

        $.ajax({
        url: "/[URL TO API Method]/GetAllOrdersbyparm",
        data: {Parm: ko.toJS(MyDataViewModel.SelectedParmater), Start: ko.toJS(MyDataViewModel.ParmStart), End: ko.toJS(MyDataViewModel.ParmEnd)},
        type: "GET",
        contentType: "application/json; charset=utf-8",
        dataType: "JSON",
        timeout: 10000,
        success: function (Result) {
            for (var i = 0; i < Result.d.length; i++) {
                element = Result.d[i];
                MyDataViewModel.OrderDetails.push({ OrderID: element.OrderID, OrderGUID: element.OrderGUID, OrderTimeStamp: element.OrderTimeStamp, OrderStatus: element.OrderStatus, QtyProductsOnOrder: element.QtyProductOnOrder, PaymentDate: element.PaymentDate });
            }
        },
        error: function (xhr, status) {
            alert(status + " - " + xhr.responseText);
        }
    });
4

2 回答 2

7

因此,这是一个 ASP.NET 特定的 Microsoft Date“标准”。

请参阅 http://www.hanselman.com/blog/OnTheNightmareThatIsJSONDatesPlusJSONNETAndASPNETWebAPI.aspx 为什么应该像瘟疫一样避免它 (1)。

在该格式中,第一个组件是自 UNIX 纪元以来的 UTC 毫秒偏移量。偏移量是本地时间,与 JS 日期字符串表示中的时区偏移量相反。

采用

var dateString = myDate.toJSON();

序列化 JS Date 对象以进行发送。

这样一个序列化的日期时间字符串,它也是 UTC(又名 *Z*ulu),因此可用于创建 Date 对象:

var myDate = new Date(dateString);

(1) 如果您需要支持这种旧的 ASP.NET 日期格式,您可以将其转换为像这样的正确 JS 日期(感谢 [Roy Tinker][2]):

myDate = new Date(parseInt("/Date(1377200468203+0200)/".substr(6)));

我不熟悉那个特定的日期时间符号。

那是国产的吗?

有这方面的文件吗?

如果不是,那么您将在尝试解释它时遇到麻烦。

转换为 JSON 将使其成为 UTC 时间,并且有一些事情可以解释,除非以分钟(没有双关语)详细记录。

所以这就是我的回答:非常确定你在规范性写作中有上述定义。


现在让我啰嗦一下:

我在这里经历了那个小练习......

http://en.wikipedia.org/wiki/ISO_8601将是一个很好的标准来建立日期时间符号。

现在,您已经从服务器获取了该格式,它看起来像自纪元 ('1970-01-01T00:00:00Z') 以来的毫秒时间值,(可能已经应用了时区偏移!)结合HHMM 中的时区偏移字符串。

这有点吓人,因为这两种成分混合得不好。

评估为表达式 1377200468203+0200 将减去八进制!200毫秒!来自 1377200468203。这显然不是预期的。

在 ISO8601(这个符号不是)中,这个时区偏移量将来自 UTC,因此毫秒值已经应用了 2 小时 0 分钟的偏移量。

现在代码当然可以在与给定日期时间处于不同时区的机器上运行。

非常关键的问题是,这个毫秒的日期时间值是否确实具有 FROM UTC 的偏移量。

在这种情况下,做 var dt = new Date(1377200468203); 会错的。

如果它接近夏令时切换时间,则仅减去以抵消它是不正确的。

于 2013-08-24T18:33:36.350 回答
1

请注意,不确定以下是否回答了您的问题。如果没有,您可能会得到以下帮助:如何格式化 JSON 日期?

这些方面的东西应该起作用:

var yyyy = element.OrderTimeStamp.getFullYear()
var mm = element.OrderTimeStamp.getMonth();
var dd = element.OrderTimeStamp.getDate();

var x = yyyy + '-' + (mm < 10 ? '0'+mm : mm) + '-' + (dd < 10 ? '0'+dd : dd)

element.OrderTimeStamp = x;

有关示例,请参见此小提琴。作为参考,MDN 页面Date在s上有很好的文档。

如果您需要更高级的日期和时间功能,我建议您查看MomentJS

于 2013-08-24T17:41:25.533 回答