如何格式化microsoft json日期?

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

我将使用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;
}

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

wkyowqbh

wkyowqbh1#

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
niwlg2el

niwlg2el2#

您可以使用此选项从json获取日期:

var date = eval(jsonDate.replace(/\/Date\((\d+)\)\//gi, "new Date($1)"));

然后,您可以使用javascript日期格式脚本(缩小和压缩时为1.2kb)根据需要显示它。

5jdjgkvh

5jdjgkvh3#

对于使用newtonsoft json.net的用户,请阅读ie8、firefox 3.5和json.net中的本机json。
另外,关于更改json.net编写的日期格式的文档也很有用:使用json.net序列化日期
对于那些太懒的人,这里有一些快速的步骤。由于json有一个松散的datetime实现,您需要使用 IsoDateTimeConverter() . 请注意,由于json.net 4.5的默认日期格式是iso,因此不需要下面的代码。

string jsonText = JsonConvert.SerializeObject(p, new IsoDateTimeConverter());

json将作为

"fieldName": "2009-04-12T20:44:55"

最后,使用一些javascript将iso日期转换为javascript日期:

function isoDateReviver(value) {
  if (typeof value === 'string') {
    var a = /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)(?:([\+-])(\d{2})\:(\d{2}))?Z?$/.exec(value);
      if (a) {
        var utcMilliseconds = Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4], +a[5], +a[6]);
        return new Date(utcMilliseconds);
      }
  }
  return value;
}

我是这样用的

$("<span />").text(isoDateReviver(item.fieldName).toLocaleString()).appendTo("#" + divName);
tez616oj

tez616oj4#

最初的例子是:

/Date(1224043200000)/

使用内置json序列化通过wcf rest发送日期时,不反映wcf使用的格式(至少在.net 3.5和sp1上)
我发现这里的答案很有用,但需要对正则表达式稍加修改,因为时区gmt偏移量似乎被附加到wcf json中返回的数字(自1970年以来)上。
在wcf服务中,我有:

[OperationContract]
[WebInvoke(
    RequestFormat = WebMessageFormat.Json,
    ResponseFormat = WebMessageFormat.Json,
    BodyStyle = WebMessageBodyStyle.WrappedRequest
    )]
ApptVisitLinkInfo GetCurrentLinkInfo( int appointmentsId );

apptvisitlinkinfo的定义很简单:

public class ApptVisitLinkInfo {
    string Field1 { get; set; }
    DateTime Field2 { get; set; }
    ...
}

当“field2”作为json从服务返回时,值为:

/Date(1224043200000-0600)/

请注意,时区偏移包含在值中。
修改后的正则表达式:

/\/Date\((.*?)\)\//gi

它更急切地抓住了双方之间的一切,而不仅仅是第一个数字。生成的时间sinze 1970,加上时区偏移都可以输入eval以获得日期对象。
替换的javascript结果行是:

replace(/\/Date\((.*?)\)\//gi, "new Date($1)");
toiithl6

toiithl65#

不要重复自己-使用$.parsejson()自动进行日期转换

您的帖子的答案提供了手动日期转换为javascript日期。我已经扩展了jquery的 $.parseJSON() 只要一点点,所以当您指示它时,它能够自动解析日期。它处理asp.net格式的日期( /Date(12348721342)/ )以及iso格式的日期( 2010-01-01T12.34.56.789Z )浏览器(以及json2.js之类的库)中的本机json函数支持的。
无论如何如果你不想一次又一次地重复你的日期转换代码,我建议你阅读这篇博客文章,并获得代码,这将使你的生活更轻松。

bxjv4tth

bxjv4tth6#

单击此处查看演示

javascript/jquery

var = MyDate_String_Value = "/Date(1224043200000)/"
var value = new Date
            (
                 parseInt(MyDate_String_Value.replace(/(^.*\()|([+-].*$)/g, ''))
            );
var dat = value.getMonth() +
                         1 +
                       "/" +
           value.getDate() +
                       "/" +
       value.getFullYear();

结果-“10/15/2008”

gg58donl

gg58donl7#

如果你用javascript说,

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

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

qxsslcnc

qxsslcnc8#

更新

我们有一个内部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路径——否则,您需要在解析后根据具体情况进行转换。

2vuwiymt

2vuwiymt9#

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

flvtvl50

flvtvl5010#

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

var d = moment(yourdatestring)

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

k10s72fa

k10s72fa11#

最后,我将“字符”添加到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);
}
db2dz4w8

db2dz4w812#

在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格式,尽管这相对容易添加。

t30tvxxf

t30tvxxf13#

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

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

输出:
2008年10月15日

os8fio9y

os8fio9y14#

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

jogvjijk

jogvjijk15#

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

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

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

相关问题