如何格式化microsoft json日期?

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

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

  1. /Date(1224043200000)/

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

  1. function getMismatch(id) {
  2. $.getJSON("Main.aspx?Callback=GetMismatch",
  3. { MismatchId: id },
  4. function (result) {
  5. $("#AuthMerchId").text(result.AuthorizationMerchantId);
  6. $("#SttlMerchId").text(result.SettlementMerchantId);
  7. $("#CreateDate").text(formatJSONDate(Date(result.AppendDts)));
  8. $("#ExpireDate").text(formatJSONDate(Date(result.ExpiresDts)));
  9. $("#LastUpdate").text(formatJSONDate(Date(result.LastUpdateDts)));
  10. $("#LastUpdatedBy").text(result.LastUpdateNt);
  11. $("#ProcessIn").text(result.ProcessIn);
  12. }
  13. );
  14. return false;
  15. }
  16. function formatJSONDate(jsonDate) {
  17. var newDate = dateFormat(jsonDate, "mm/dd/yyyy");
  18. return newDate;
  19. }

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

k10s72fa

k10s72fa1#

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

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

在你的aspx里你有

  1. <script type="text/javascript">
  2. var myObject = '<%= JsonObject %>';
  3. </script>

你会得到这样的结果

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

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

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

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

  1. String.prototype.evalJSONWithDates = function() {
  2. var jsonWithDates = this.replace(/"\/Date\((\d+)\)\/"/g, 'new Date($1)');
  3. return jsonWithDates.evalJSON(true);
  4. }
展开查看全部
bpzcxfmw

bpzcxfmw2#

我的日期是这样的:

  1. "/Date(1276290000000+0300)/"

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

  1. "/Date(12762900000000300)/"
  2. "Date(1276290000000-0300)"


因此,我提出了以下regexp:

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

最后的代码是:

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

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

展开查看全部
vu8f3i0k

vu8f3i0k3#

这也可能对你有所帮助。

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

qhhrdooz4#

  1. 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的日期字符串

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

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

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

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

展开查看全部
v64noz0r

v64noz0r6#

以超级棒的帖子发布:

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

jogvjijk7#

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

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

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

os8fio9y

os8fio9y8#

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

t30tvxxf

t30tvxxf9#

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

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

输出:
2008年10月15日

db2dz4w8

db2dz4w810#

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

  1. (function () {
  2. var DATE_START = "/Date(";
  3. var DATE_START_LENGTH = DATE_START.length;
  4. function isDateString(x) {
  5. return typeof x === "string" && x.startsWith(DATE_START);
  6. }
  7. function deserializeDateString(dateString) {
  8. var dateOffsetByLocalTime = new Date(parseInt(dateString.substr(DATE_START_LENGTH)));
  9. var utcDate = new Date(dateOffsetByLocalTime.getTime() - dateOffsetByLocalTime.getTimezoneOffset() * 60 * 1000);
  10. return utcDate;
  11. }
  12. function convertJSONDates(key, value) {
  13. if (isDateString(value)) {
  14. return deserializeDateString(value);
  15. }
  16. return value;
  17. }
  18. window.jQuery.ajaxSetup({
  19. converters: {
  20. "text json": function(data) {
  21. return window.JSON.parse(data, convertJSONDates);
  22. }
  23. }
  24. });
  25. }());

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

展开查看全部
wkyowqbh

wkyowqbh11#

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

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

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

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

flvtvl5012#

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

  1. 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日期格式

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

2) 检测iso日期格式

  1. 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)?$/;
  2. function looksLikeIsoDate(s) {
  3. return isoDateRegex.test(s);
  4. }

3) 解析ms日期格式:

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

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

  1. function parseIsoDate(s) {
  2. var m = isoDateRegex.exec(s);
  3. // Is this UTC, offset, or undefined? Treat undefined as UTC.
  4. if (m.length == 7 || // Just the y-m-dTh:m:s, no ms, no tz offset - assume UTC
  5. (m.length > 7 && (
  6. !m[7] || // Array came back length 9 with undefined for 7 and 8
  7. m[7].charAt(0) != '.' || // ms portion, no tz offset, or no ms portion, Z
  8. !m[8] || // ms portion, no tz offset
  9. m[8] == 'Z'))) { // ms portion and Z
  10. // 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.
  11. var d = new Date(Date.UTC(m[1], m[2]-1, m[3], m[4], m[5], m[6]));
  12. } else {
  13. // local
  14. var d = new Date(m[1], m[2]-1, m[3], m[4], m[5], m[6]);
  15. }
  16. return d;
  17. }

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

  1. function parseIsoDate(s) {
  2. return new Date(s);
  3. }

5) 格式:

  1. function hasTime(d) {
  2. return !!(d.getUTCHours() || d.getUTCMinutes() || d.getUTCSeconds());
  3. }
  4. function zeroFill(n) {
  5. if ((n + '').length == 1)
  6. return '0' + n;
  7. return n;
  8. }
  9. function formatDate(d) {
  10. if (hasTime(d)) {
  11. var s = (d.getMonth() + 1) + '/' + d.getDate() + '/' + d.getFullYear();
  12. s += ' ' + d.getHours() + ':' + zeroFill(d.getMinutes()) + ':' + zeroFill(d.getSeconds());
  13. } else {
  14. var s = (d.getMonth() + 1) + '/' + d.getDate() + '/' + d.getFullYear();
  15. }
  16. return s;
  17. }

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

  1. function parseDate(s) {
  2. var d;
  3. if (looksLikeMSDate(s))
  4. d = parseMSDate(s);
  5. else if (looksLikeIsoDate(s))
  6. d = parseIsoDate(s);
  7. else
  8. return null;
  9. return formatDate(d);
  10. }

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

旧答案

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

  1. // Once
  2. jQuery.parseJSON = function(d) {return eval('(' + d + ')');};
  3. $.ajax({
  4. ...
  5. dataFilter: function(d) {
  6. return d.replace(/"\\\/(Date\(-?\d+\))\\\/"/g, 'new $1');
  7. },
  8. ...
  9. });

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

展开查看全部
gg58donl

gg58donl15#

如果你用javascript说,

  1. var thedate = new Date(1224043200000);
  2. alert(thedate);

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

相关问题