在推入ko.observableArray之前格式化JSON日期

Jac*_*rst 5 json knockout.js

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

我要转换的代码中的特定元素是: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);
        }
    });
Run Code Online (Sandbox Code Playgroud)

sta*_*low 7

因此,这是ASP.NET特定的Microsoft Date"标准".

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

在该格式中,第一个组件是自UNIX纪元以来的UTC毫秒偏移量.偏移量为TO local time,与JS Date字符串表示形式中的时区偏移量相反.

使用

var dateString = myDate.toJSON();
Run Code Online (Sandbox Code Playgroud)

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

这样的序列化日期时间字符串也是UTC(aka*Z*ulu),可用于创建Date对象:

var myDate = new Date(dateString);
Run Code Online (Sandbox Code Playgroud)

(1)如果你需要支持这种旧的ASP.NET日期格式,你可以将它转换为适当的JS日期(感谢[Roy Tinker] [2]):

myDate = new Date(parseInt("/Date(1377200468203+0200)/".substr(6)));
Run Code Online (Sandbox Code Playgroud)

我不熟悉那个特定的日期时间表示法.

那是本土的吗?

那有文件吗?

如果没有,那么你就是在试图解释它时遇到麻烦.

转换为JSON会使其成为UTC时间,并且有一些事情可以解释,除非记录在分钟(无双关语)细节中.

所以这是我的答案:请确保您在规范性写作中有上述定义.


现在让我絮絮叨叨地说:

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

http://en.wikipedia.org/wiki/ISO_8601将成为基于日期时间表示法的良好标准.

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

这有点可怕,因为这两个组件混合不好.

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

在ISO8601(此表示法不是)中,此时区偏移量将是FROM UTC,因此毫秒值已经应用了2小时0分钟的偏移量.

现在,代码当然可以在与给定日期时间不同的时区上运行.

非常关键的问题是这个毫秒日期时间值是否确实存在其中的UTC偏移量.

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

如果它接近夏令时切换时间,则仅减去偏差就不正确.