如何格式化microsoft json日期?

qmb5sa22  于 2021-09-29  发布在  Java
关注(0)|答案(20)|浏览(614)

我将使用jquery首次尝试ajax。我正在将数据放到我的页面上,但是对于日期数据类型返回的json数据,我遇到了一些问题。基本上,我得到了一个字符串,看起来像这样:

/Date(1224043200000)/

从一个对json完全陌生的人-我如何将其格式化为短日期格式?这应该在jquery代码中的某个地方处理吗?我已经试过了 jQuery.UI.datepicker 插件使用 $.datepicker.formatDate() 没有任何成功。
仅供参考:以下是我结合以下答案提出的解决方案:

function getMismatch(id) {
  $.getJSON("Main.aspx?Callback=GetMismatch",
    { MismatchId: id },

    function (result) {
      $("#AuthMerchId").text(result.AuthorizationMerchantId);
      $("#SttlMerchId").text(result.SettlementMerchantId);
      $("#CreateDate").text(formatJSONDate(Date(result.AppendDts)));
      $("#ExpireDate").text(formatJSONDate(Date(result.ExpiresDts)));
      $("#LastUpdate").text(formatJSONDate(Date(result.LastUpdateDts)));
      $("#LastUpdatedBy").text(result.LastUpdateNt);
      $("#ProcessIn").text(result.ProcessIn);
    }
  );

  return false;
}

function formatJSONDate(jsonDate) {
  var newDate = dateFormat(jsonDate, "mm/dd/yyyy");
  return newDate;
}

此解决方案从回调方法获取我的对象,并使用日期格式库在页面上正确显示日期。

k10s72fa

k10s72fa1#

最后,我将“字符”添加到panos的正则表达式中,以消除microsoft serializer在将对象写入内联脚本时生成的字符:
如果你的c代码中有一个属性

protected string JsonObject { get { return jsSerialiser.Serialize(_myObject); }}

在你的aspx里你有

<script type="text/javascript">
    var myObject = '<%= JsonObject %>';
</script>

你会得到这样的结果

var myObject = '{"StartDate":"\/Date(1255131630400)\/"}';

注意双引号。
为了将其转换为eval将正确反序列化的表单,我使用了:

myObject = myObject.replace(/"\/Date\((\d+)\)\/"/g, 'new Date($1)');

我使用原型,并使用它,我补充说

String.prototype.evalJSONWithDates = function() {
    var jsonWithDates = this.replace(/"\/Date\((\d+)\)\/"/g, 'new Date($1)');
    return jsonWithDates.evalJSON(true);
}
bpzcxfmw

bpzcxfmw2#

我的日期是这样的:

"/Date(1276290000000+0300)/"

在某些示例中,日期的格式略有不同:

"/Date(12762900000000300)/"
"Date(1276290000000-0300)"


因此,我提出了以下regexp:

/\/+Date\(([\d+]+)\)\/+/

最后的代码是:

var myDate = new Date(parseInt(jsonWcfDate.replace(/\/+Date\(([\d+-]+)\)\/+/, '$1')));

希望能有帮助。
更新:我从microsoft找到了此链接:如何使用json序列化日期?
这似乎是我们都在寻找的。

vu8f3i0k

vu8f3i0k3#

这也可能对你有所帮助。

function ToJavaScriptDate(value) { //To Parse Date from the Returned Parsed Date
        var pattern = /Date\(([^)]+)\)/;
        var results = pattern.exec(value);
        var dt = new Date(parseFloat(results[1]));
        return (dt.getMonth() + 1) + "/" + dt.getDate() + "/" + dt.getFullYear();
    }
qhhrdooz

qhhrdooz4#

var newDate = dateFormat(jsonDate, "mm/dd/yyyy");

有没有其他不使用jquery库的选项?

xfyts7mz

xfyts7mz5#

这里添加另一种方法,wcf采用的“滴答声方法”很容易出现时区问题,如果您不非常小心,如本文和其他地方所述。因此,我现在使用.net和javascript都支持的iso 8601格式,其中包括时区偏移。详情如下:
在wcf/.net中:
其中creationdate是system.datetime;tostring(“o”)使用.net的往返格式说明符生成符合iso 8601的日期字符串

new MyInfo {
    CreationDate = r.CreationDate.ToString("o"),
};

在javascript中
在检索json之后,我使用接受iso 8601日期字符串的日期构造函数将日期固定为javasript日期对象。。。

$.getJSON(
    "MyRestService.svc/myinfo",
    function (data) {
        $.each(data.myinfos, function (r) {
            this.CreatedOn = new Date(this.CreationDate);
        });
        // Now each myinfo object in the myinfos collection has a CreatedOn field that is a real JavaScript date (with timezone intact).
       alert(data.myinfos[0].CreationDate.toLocaleString());
    }
)

一旦有了javascript日期,就可以使用所有方便可靠的日期方法,如todatestring、tolocalestring等。

v64noz0r

v64noz0r6#

以超级棒的帖子发布:

var d = new Date(parseInt('/Date(1224043200000)/'.slice(6, -2)));
alert('' + (1 + d.getMonth()) + '/' + d.getDate() + '/' + d.getFullYear().toString().slice(-2));
jogvjijk

jogvjijk7#

所有这些答案都有一个共同点:它们都将日期存储为单个值(通常是字符串)。
另一种选择是利用json的固有结构,将日期表示为数字列表:

{ "name":"Nick",
  "birthdate":[1968,6,9] }

当然,您必须确保对话的两端都同意格式(年、月、日),以及哪些字段是日期,。。。但它的优点是完全避免了日期到字符串转换的问题。都是数字,根本没有字符串。此外,使用顺序:年、月、日还允许按日期进行适当排序。
只需跳出框框思考——json日期不必存储为字符串。
这样做的另一个好处是,通过利用couchdb处理数组值查询的方式,您可以轻松(高效)选择给定年份或月份的所有记录。

os8fio9y

os8fio9y8#

别想太多了。就像我们几十年来所做的那样,从1970年1月1日午夜gmt/utc/&c这一事实上的标准纪元开始,以秒(或毫秒)为单位传递一个数字偏移量。javascript喜欢它,java喜欢它,c喜欢它,互联网也喜欢它。

t30tvxxf

t30tvxxf9#

使用jquery ui日期选择器-只有在已经包含jquery ui时才有意义:

$.datepicker.formatDate('MM d, yy', new Date(parseInt('/Date(1224043200000)/'.substr(6))));

输出:
2008年10月15日

db2dz4w8

db2dz4w810#

在jQuery1.5中,只要您有json2.js来覆盖较旧的浏览器,您就可以按如下方式反序列化来自ajax的所有日期:

(function () {
    var DATE_START = "/Date(";
    var DATE_START_LENGTH = DATE_START.length;

    function isDateString(x) {
        return typeof x === "string" && x.startsWith(DATE_START);
    }

    function deserializeDateString(dateString) {
        var dateOffsetByLocalTime = new Date(parseInt(dateString.substr(DATE_START_LENGTH)));
        var utcDate = new Date(dateOffsetByLocalTime.getTime() - dateOffsetByLocalTime.getTimezoneOffset() * 60 * 1000);
        return utcDate;
    }

    function convertJSONDates(key, value) {
      if (isDateString(value)) {
        return deserializeDateString(value);
      }
      return value;
    }

    window.jQuery.ajaxSetup({
      converters: {
        "text json": function(data) {
          return window.JSON.parse(data, convertJSONDates);
        }
      }
    });
}());

我包含的逻辑假设您以utc(您应该这样做)的形式从服务器发送所有日期;然后消费者会得到一个javascript Date 对象,该对象具有适当的刻度值以反映此情况。就是打电话 getUTCHours() ,等。将返回与服务器上相同的值,并调用 getHours() 将返回由浏览器确定的用户本地时区中的值。
这并没有考虑到带有时区偏移的wcf格式,尽管这相对容易添加。

wkyowqbh

wkyowqbh11#

eval() 没有必要。这很好:

var date = new Date(parseInt(jsonDate.substr(6)));

这个 substr() 函数将 /Date( 部分,以及 parseInt() 函数获取整数并忽略 )/ 最后。生成的数字被传递到 Date 构造器。
我故意省略了基数(第二个参数) parseInt ); 见下面我的评论。
此外,我完全同意rory的意见:iso-8601日期比旧格式更受欢迎,因此新开发通常不应使用这种格式。
对于iso-8601格式的json日期,只需将字符串传递到 Date 建造商:

var date = new Date(jsonDate); //no ugly parsing needed; full timezone support
flvtvl50

flvtvl5012#

我还必须寻找解决这个问题的方法,最终我遇到了momente.js,它是一个很好的库,可以解析这个日期格式以及更多内容。

var d = moment(yourdatestring)

它让我省去了一些头痛,所以我想我会和你分享它。:)
您可以在此处找到有关它的更多信息:http://momentjs.com/

2vuwiymt

2vuwiymt13#

json中没有内置的日期类型。这看起来像是某个历元的秒/毫秒数。如果您知道纪元,您可以通过添加适当的时间量来创建日期。

qxsslcnc

qxsslcnc14#

更新

我们有一个内部ui库,它必须同时处理microsoft的asp.net内置json格式,如 /Date(msecs)/ ,最初在这里被问及,大多数json的日期格式包括json.net,如 2014-06-22T00:00:00.0 . 此外,我们还需要处理oldie无法处理小数点后3位以外的任何内容。
我们首先检测我们使用的日期类型,将其解析为普通javascript Date 对象,然后将其格式化。
1) 检测microsoft日期格式

// Handling of Microsoft AJAX Dates, formatted like '/Date(01238329348239)/'
function looksLikeMSDate(s) {
    return /^\/Date\(/.test(s);
}

2) 检测iso日期格式

var isoDateRegex = /^(\d\d\d\d)-(\d\d)-(\d\d)T(\d\d):(\d\d):(\d\d)(\.\d\d?\d?)?([\+-]\d\d:\d\d|Z)?$/;

function looksLikeIsoDate(s) {
    return isoDateRegex.test(s);
}

3) 解析ms日期格式:

function parseMSDate(s) {
    // Jump forward past the /Date(, parseInt handles the rest
    return new Date(parseInt(s.substr(6)));
}

4) 解析iso日期格式。
我们至少有办法确保我们处理的是标准iso日期或修改为始终有三个毫秒位置的iso日期(见上文),因此代码因环境而异。
4a)解析标准iso日期格式,处理oldie的问题:

function parseIsoDate(s) {
    var m = isoDateRegex.exec(s);

    // Is this UTC, offset, or undefined? Treat undefined as UTC.
    if (m.length == 7 ||                // Just the y-m-dTh:m:s, no ms, no tz offset - assume UTC
        (m.length > 7 && (
            !m[7] ||                    // Array came back length 9 with undefined for 7 and 8
            m[7].charAt(0) != '.' ||    // ms portion, no tz offset, or no ms portion, Z
            !m[8] ||                    // ms portion, no tz offset
            m[8] == 'Z'))) {            // ms portion and Z
        // JavaScript's weirdo date handling expects just the months to be 0-based, as in 0-11, not 1-12 - the rest are as you expect in dates.
        var d = new Date(Date.UTC(m[1], m[2]-1, m[3], m[4], m[5], m[6]));
    } else {
        // local
        var d = new Date(m[1], m[2]-1, m[3], m[4], m[5], m[6]);
    }

    return d;
}

4b)解析具有固定小数点后3毫秒的iso格式-更容易:

function parseIsoDate(s) {
    return new Date(s);
}

5) 格式:

function hasTime(d) {
    return !!(d.getUTCHours() || d.getUTCMinutes() || d.getUTCSeconds());
}

function zeroFill(n) {
    if ((n + '').length == 1)
        return '0' + n;

    return n;
}

function formatDate(d) {
    if (hasTime(d)) {
        var s = (d.getMonth() + 1) + '/' + d.getDate() + '/' + d.getFullYear();
        s += ' ' + d.getHours() + ':' + zeroFill(d.getMinutes()) + ':' + zeroFill(d.getSeconds());
    } else {
        var s = (d.getMonth() + 1) + '/' + d.getDate() + '/' + d.getFullYear();
    }

    return s;
}

6) 将所有这些联系在一起:

function parseDate(s) {
    var d;
    if (looksLikeMSDate(s))
        d = parseMSDate(s);
    else if (looksLikeIsoDate(s))
        d = parseIsoDate(s);
    else
        return null;

    return formatDate(d);
}

下面的旧答案对于将此日期格式绑定到jquery自己的json解析中非常有用,这样您就可以得到日期对象而不是字符串,或者如果您仍然在jquery<1.5中挣扎的话。

旧答案

如果在asp.net mvc中使用jquery 1.4的ajax功能,则可以通过以下方式将所有日期时间属性转换为日期对象:

// Once
jQuery.parseJSON = function(d) {return eval('(' + d + ')');};

$.ajax({
    ...
    dataFilter: function(d) {
        return d.replace(/"\\\/(Date\(-?\d+\))\\\/"/g, 'new $1');
    },
    ...
});

在jQuery1.5中,可以避免重写 parseJSON 方法,通过在ajax调用中使用converters选项全局执行。
http://api.jquery.com/jquery.ajax/
不幸的是,为了获得全局解析的日期,您必须切换到较旧的eval路径——否则,您需要在解析后根据具体情况进行转换。

gg58donl

gg58donl15#

如果你用javascript说,

var thedate = new Date(1224043200000);
alert(thedate);

您将看到它是正确的日期,并且您可以在javascript代码中的任何地方将其用于任何框架。

相关问题