2104

我正在使用 jQuery首次尝试Ajax 。我正在将我的数据放到我的页面上,但是我在处理为 Date 数据类型返回的 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;
}

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

4

41 回答 41

1745

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
于 2010-02-23T04:15:09.440 回答
138

您可以使用它从 JSON 中获取日期:

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

然后您可以使用JavaScript 日期格式脚本(压缩和 gzip 后为 1.2 KB)根据需要显示它。

于 2008-10-15T21:14:32.247 回答
103

对于那些使用 Newtonsoft Json.NET的人,请阅读如何通过IE8、Firefox 3.5 和 Json.NET 中的 Native JSON 进行操作。

关于更改由 Json.NET 编写的日期格式的文档也很有用: Serializing Dates with 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);
于 2010-01-19T04:53:24.090 回答
70

原始示例:

/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)");
于 2009-12-30T01:21:28.493 回答
66

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

对您的帖子的回答提供了到 JavaScript 日期的手动日期转换。我对 jQuery$.parseJSON()进行了一点扩展,因此它能够在您指示它时自动解析日期。它处理 ASP.NET 格式的日期 ( /Date(12348721342)/) 以及 ISO 格式的日期 ( 2010-01-01T12.34.56.789Z),这些日期由浏览器中的本机 JSON 函数(以及 json2.js 等库)支持。

反正。如果您不想一遍又一遍地重复日期转换代码,我建议您阅读这篇博文并获取可以让您的生活更轻松的代码。

于 2010-12-27T16:21:04.327 回答
64

点击这里查看演示

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();

结果- “2008 年 10 月 15 日”

于 2013-03-17T17:41:21.183 回答
63

如果你用 JavaScript 说,

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

你会看到它是正确的日期,你可以在任何框架的 JavaScript 代码中使用它。

于 2008-10-15T20:49:58.207 回答
39

更新

我们有一个内部 UI 库,它必须同时处理 Microsoft 的 ASP.NET 内置 JSON 格式,如/Date(msecs)/最初在这里询问的,以及大多数 JSON 的日期格式,包括 JSON.NET 的,如2014-06-22T00:00:00.0. 此外,我们需要解决oldIE 无法处理小数点后 3 位以外的任何问题

我们首先检测我们正在使用的日期类型,将其解析为普通的 JavaScriptDate对象,然后将其格式化。

1)检测微软日期格式

// 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 日期或修改为始终具有 3 毫秒位置的 ISO 日期(见上文),因此代码因环境而异。

4a) 解析标准ISO Date格式,处理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) 使用固定的三毫秒小数位解析 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 解析中很有用,这样您就可以获得 Date 对象而不是字符串,或者如果您仍然以某种方式陷入 jQuery <1.5。

旧答案

如果您在 ASP.NET MVC 中使用 jQuery 1.4 的 Ajax 函数,您可以使用以下命令将所有 DateTime 属性转换为 Date 对象:

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

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

parseJSON在 jQuery 1.5 中,您可以通过在 Ajax 调用中使用转换器选项来避免全局覆盖该方法。

http://api.jquery.com/jQuery.ajax/

不幸的是,您必须切换到较旧的 eval 路线才能让 Dates 就地全局解析 - 否则您需要在解析后更具体地转换它们。

于 2011-02-07T23:56:28.583 回答
29

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

于 2008-10-15T20:46:51.770 回答
28

我还必须寻找解决这个问题的方法,最终我遇到了 moment.js,这是一个很好的库,可以解析这种日期格式等等。

var d = moment(yourdatestring)

它为我节省了一些头痛,所以我想我会与你分享。:)
你可以在这里找到更多关于它的信息:http: //momentjs.com/

于 2013-05-15T06:36:24.000 回答
25

我最终将“字符添加到 Panos 的正则表达式中,以摆脱 Microsoft 序列化程序在将对象写入内联脚本时生成的字符:

因此,如果您的 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)');

我使用Prototype并添加了使用它

String.prototype.evalJSONWithDates = function() {
    var jsonWithDates = this.replace(/"\/Date\((\d+)\)\/"/g, 'new Date($1)');
    return jsonWithDates.evalJSON(true);
}
于 2009-10-09T01:03:56.563 回答
23

在 jQuery 1.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 格式从服务器发送所有日期的逻辑(您应该这样做);然后,消费者会获得一个 JavaScriptDate对象,该对象具有适当的刻度值来反映这一点。也就是说,getUTCHours()在日期调用 等将返回与在服务器上相同的值,调用getHours()将返回由浏览器确定的用户本地时区中的值。

这没有考虑带有时区偏移的WCF格式,尽管添加起来相对容易。

于 2011-04-08T01:59:11.947 回答
21

使用 jQuery UI datepicker - 只有当你已经包含 jQuery UI 时才有意义:

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

输出:

2008 年 10 月 15 日

于 2011-08-30T09:33:08.210 回答
20

不要想太多。就像我们几十年来所做的那样,从 1970 年 1 月 1 日午夜 GMT/UTC/&c 的事实上的标准纪元传递一个数字偏移量,以自该纪元以来的秒数(或毫秒数)为单位。JavaScript 喜欢它,Java 喜欢它,C 喜欢它,互联网也喜欢它。

于 2009-10-30T04:45:19.530 回答
19

这些答案中的每个人都有一个共同点:它们都将日期存储为单个值(通常是字符串)。

另一种选择是利用 JSON 的固有结构,并将日期表示为数字列表:

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

当然,您必须确保对话的双方就格式(年、月、日)以及哪些字段应为日期达成一致,......但它具有完全避免日期问题的优势- 到字符串的转换。都是数字——根本没有字符串。此外,使用顺序:年、月、日也允许按日期正确排序。

在这里跳出框框思考——JSON 日期不必存储为字符串。

这样做的另一个好处是,您可以通过利用CouchDB处理数组值查询的方式轻松(有效地)选择给定年份或月份的所有记录。

于 2011-06-17T03:54:33.177 回答
17

在很棒的线程中发布:

var d = new Date(parseInt('/Date(1224043200000)/'.slice(6, -2)));
alert('' + (1 + d.getMonth()) + '/' + d.getDate() + '/' + d.getFullYear().toString().slice(-2));
于 2010-09-26T11:20:11.303 回答
17

只是在这里添加另一种方法,如果您不是非常小心,如此和其他地方所述, WCF采用的“刻度方法”很容易出现时区问题。所以我现在使用 .NET 和 JavaScript 都支持的 ISO 8601 格式,包括时区偏移。以下是详细信息:

在 WCF/.NET 中:

其中 CreationDate 是 System.DateTime;ToString("o") 使用 .NET 的往返格式说明符,生成符合 ISO 8601 的日期字符串

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

在 JavaScript 中

就在检索 JSON 之后,我使用 Date 构造函数将日期修复为 JavaSript Date 对象,该构造函数接受 ISO 8601 日期字符串......

$.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 日期,您就可以使用所有方便可靠的 Date 方法,例如toDateStringtoLocaleString等。

于 2012-05-24T19:01:41.737 回答
16
var newDate = dateFormat(jsonDate, "mm/dd/yyyy"); 

在不使用 jQuery 库的情况下还有其他选择吗?

于 2009-09-24T11:38:51.997 回答
11

这也可能对您有所帮助。

 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();
    }
于 2016-02-02T11:57:13.093 回答
10

我得到这样的日期:

"/Date(1276290000000+0300)/"

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

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

等等

所以我想出了以下正则表达式:

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

最终代码是:

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

希望能帮助到你。

更新:我从 Microsoft 找到了这个链接: 如何使用 JSON 序列化日期?

这似乎是我们都在寻找的。

于 2010-09-26T11:07:09.977 回答
10

下面是一个非常简单的解析 JSON 日期的解决方案。根据您的要求使用以下功能。您只需将获取的 JSON 格式日期作为参数传递给以下函数:

function JSONDate(dateStr) {
    var m, day;
    jsonDate = dateStr;
    var d = new Date(parseInt(jsonDate.substr(6)));
    m = d.getMonth() + 1;
    if (m < 10)
        m = '0' + m
    if (d.getDate() < 10)
        day = '0' + d.getDate()
    else
        day = d.getDate();
    return (m + '/' + day + '/' + d.getFullYear())
}

function JSONDateWithTime(dateStr) {
    jsonDate = dateStr;
    var d = new Date(parseInt(jsonDate.substr(6)));
    var m, day;
    m = d.getMonth() + 1;
    if (m < 10)
        m = '0' + m
    if (d.getDate() < 10)
        day = '0' + d.getDate()
    else
        day = d.getDate();
    var formattedDate = m + "/" + day + "/" + d.getFullYear();
    var hours = (d.getHours() < 10) ? "0" + d.getHours() : d.getHours();
    var minutes = (d.getMinutes() < 10) ? "0" + d.getMinutes() : d.getMinutes();
    var formattedTime = hours + ":" + minutes + ":" + d.getSeconds();
    formattedDate = formattedDate + " " + formattedTime;
    return formattedDate;
}
于 2012-08-09T12:14:59.823 回答
10

您还可以使用 JavaScript 库moment.js,当您计划处理不同的本地化格式并使用日期值执行其他操作时,它会派上用场:

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

    function (result) {
        $("#AuthMerchId").text(result.AuthorizationMerchantId);
        $("#SttlMerchId").text(result.SettlementMerchantId);
        $("#CreateDate").text(moment(result.AppendDts).format("L"));
        $("#ExpireDate").text(moment(result.ExpiresDts).format("L"));
        $("#LastUpdate").text(moment(result.LastUpdateDts).format("L"));
        $("#LastUpdatedBy").text(result.LastUpdateNt);
        $("#ProcessIn").text(result.ProcessIn);
    }
    );
    return false;
}

设置本地化就像将配置文件(您可以在 momentjs.com 上获得)添加到您的项目并配置语言一样简单:

moment.lang('de');
于 2013-05-15T06:21:00.740 回答
9

检查日期ISO标准;有点像这样:

yyyy.MM.ddThh:mm

它变成2008.11.20T22:18.

于 2008-11-20T09:18:59.753 回答
9

这令人沮丧。我的解决方案是从 ASP.NET 的 JavaScriptSerializer 生成的值中解析出“/ 和 /”,这样,虽然 JSON 可能没有日期文字,它仍然被浏览器解释为日期,这就是我真正想要的想:{"myDate":Date(123456789)}

DateTime 的自定义 JavaScriptConverter?

我必须强调 Roy Tinker 评论的准确性。这不是合法的 JSON。在它成为 JavaScript 的问题之前解决问题是服务器上的一个肮脏的、肮脏的 hack。它会阻塞 JSON 解析器。我用它来起步,但我不再使用它了。但是,我仍然认为最好的答案在于更改服务器格式化日期的方式,例如其他地方提到的 ISO。

于 2010-10-14T05:02:46.490 回答
8

一个迟到的帖子,但对于那些搜索过这个帖子的人。

想象一下:

    [Authorize(Roles = "Administrator")]
    [Authorize(Roles = "Director")]
    [Authorize(Roles = "Human Resources")]
    [HttpGet]
    public ActionResult GetUserData(string UserIdGuidKey)
    {
        if (UserIdGuidKey!= null)
        {
            var guidUserId = new Guid(UserIdGuidKey);
            var memuser = Membership.GetUser(guidUserId);
            var profileuser = Profile.GetUserProfile(memuser.UserName);
            var list = new {
                              UserName = memuser.UserName,
                              Email = memuser.Email ,
                              IsApproved = memuser.IsApproved.ToString() ,
                              IsLockedOut = memuser.IsLockedOut.ToString() ,
                              LastLockoutDate = memuser.LastLockoutDate.ToString() ,
                              CreationDate = memuser.CreationDate.ToString() ,
                              LastLoginDate = memuser.LastLoginDate.ToString() ,
                              LastActivityDate = memuser.LastActivityDate.ToString() ,
                              LastPasswordChangedDate = memuser.LastPasswordChangedDate.ToString() ,
                              IsOnline = memuser.IsOnline.ToString() ,
                              FirstName = profileuser.FirstName ,
                              LastName = profileuser.LastName ,
                              NickName = profileuser.NickName ,
                              BirthDate = profileuser.BirthDate.ToString() ,
            };
            return Json(list, JsonRequestBehavior.AllowGet);
        }
        return Redirect("Index");
    }

如您所见,我正在利用 C# 3.0 的特性来创建“自动”泛型。这有点懒,但我喜欢它并且它有效。请注意:Profile 是我为我的 Web 应用程序项目创建的自定义类。

于 2009-10-23T06:39:45.783 回答
8

Mootools 解决方案:

new Date(Date(result.AppendDts)).format('%x')

需要更多的mootools。在 Firefox 3.6.3 和 IE 7.0.5730.13 上使用 mootools-1.2.3.1-more 进行了测试

于 2010-05-13T08:02:43.273 回答
8

仅供参考,对于在服务器端使用 Python 的任何人:datetime.datetime().ctime() 返回一个可由“new Date()”本机解析的字符串。也就是说,如果您创建一个新的 datetime.datetime 实例(例如使用 datetime.datetime.now),则该字符串可以包含在 JSON 字符串中,然后可以将该字符串作为第一个参数传递给 Date 构造函数。我还没有发现任何异常,但我也没有太严格地测试它。

于 2010-07-08T01:19:36.757 回答
8
var obj = eval('(' + "{Date: \/Date(1278903921551)\/}".replace(/\/Date\((\d+)\)\//gi, "new Date($1)") + ')');
var dateValue = obj["Date"];
于 2011-07-01T08:07:32.410 回答
8

在页面中添加jQuery UI插件:

function DateFormate(dateConvert) {
    return $.datepicker.formatDate("dd/MM/yyyy", eval('new ' + dateConvert.slice(1, -1)));
};
于 2012-06-29T12:01:04.050 回答
8

如果.NET返回...

return DateTime.Now.ToString("u"); //"2013-09-17 15:18:53Z"

然后在 JavaScript 中......

var x = new Date("2013-09-17 15:18:53Z");
于 2013-09-17T19:22:04.530 回答
7

在下面的代码中。我有

1.从日期字符串中检索时间戳。

2.并将其解析为Int

3.最后创建了一个Date使用它。

var dateString = "/Date(1224043200000)/";
var seconds = parseInt(dateString.replace(/\/Date\(([0-9]+)[^+]\//i, "$1"));
var date = new Date(seconds);
console.log(date);

于 2018-03-09T08:22:46.117 回答
6

TLDR:您无法可靠地转换该仅限日期的值,而是发送一个字符串......

...或者至少这就是几乎所有这些答案应该开始的方式。

这里发生了许多转换问题。

这是一个没有时间的约会

每个人似乎都缺少的东西是问题中有多少尾随零 - 它几乎肯定是作为一个没有时间的日期开始的:

/Date(1224043200000)/

当从 javascript 控制台作为新日期执行此操作时(许多答案的基础)

new Date(1224043200000)

你得到:

在此处输入图像描述

最初的询问者可能在 EST 中,并且有一个纯日期(sql)或一个带午夜的 DateTime(不是 DateTimeOffset)。

换句话说,这里的意图是时间部分是没有意义的。但是,如果浏览器在与生成它的服务器相同的时区执行此操作,则无关紧要,并且大多数答案都有效。

时区位

但是,如果您在具有不同时区(例如 PST)的机器上执行上述代码:

在此处输入图像描述

您会注意到,我们现在在另一个时区落后了一天。这不会通过更改序列化程序来解决(仍将包括 iso 格式的时区)

问题

Date (sql) 和 DateTime (.net) 上没有时区,但是一旦将它们转换为具有时区的东西(在这种情况下通过 json 推断),.net 中的默认操作是假定当前时区.

序列化创建的数字是自 unix 纪元以来的毫秒数,或者:

(DateTimeOffset.Parse("10/15/2008 00:00:00Z") - DateTimeOffset.Parse("1/1/1970 00:00:00Z")).TotalMilliseconds;

这是javascript中的 new Date() 作为参数的东西。Epoch 来自 UTC,所以现在无论您是否想要,您都可以在其中获得时区信息。

可能的解决方案:

在您的序列化对象上创建一个仅表示日期的字符串属性可能更安全 - 带有“10/15/2008”的字符串不太可能将其他任何人与这种混乱混淆。尽管即使在那里你也必须在解析方面小心: https ://stackoverflow.com/a/31732581

但是,本着为所提问题提供答案的精神,如下所示:

function adjustToLocalMidnight(serverMidnight){ 
  var serverOffset=-240; //injected from model? <-- DateTimeOffset.Now.Offset.TotalMinutes
  var localOffset=-(new Date()).getTimezoneOffset(); 
  return new Date(date.getTime() + (serverOffset-localOffset) * 60 * 1000)
}

var localMidnightDate = adjustToLocalMidnight(new Date(parseInt(jsonDate.substr(6))));
于 2019-05-31T20:02:53.490 回答
4

附带说明一下,KendoUI 支持转换 Microsoft JSON 日期。因此,如果您的项目引用了“KendoUI”,您可以简单地使用

var newDate = kendo.parseDate(jsonDate);
于 2013-11-27T09:02:32.557 回答
4

这使用正则表达式,它也可以工作:

var date = new Date(parseInt(/^\/Date\((.*?)\)\/$/.exec(jsonDate)[1], 10));
于 2014-08-25T16:44:24.803 回答
3

您可以尝试使用的另一个正则表达式示例:

var mydate = json.date
var date = new Date(parseInt(mydate.replace(/\/Date\((-?\d+)\)\//, '$1');
mydate = date.getMonth() + 1 + '/' + date.getDate() + '/' + date.getFullYear();

date.getMonth()返回一个 0 - 11 的整数,所以我们必须加 1 才能获得正确的月份数

于 2015-08-06T11:37:22.523 回答
3

我可以建议的最简单的方法是在JSas 上使用正则表达式:

//Only use [0] if you are sure that the string matches the pattern
//Otherwise, verify if 'match' returns something
"/Date(1512488018202)/".match(/\d+/)[0] 
于 2017-12-05T15:37:25.073 回答
3

我使用这个简单的函数从 Microsoft JSON Date 获取日期

function getDateValue(dateVal) {
    return new Date(parseInt(dateVal.replace(/\D+/g, '')));
};

replace(/\D+/g, '')将删除除数字以外的所有字符

parseInt将字符串转换为数字

用法

$scope.ReturnDate = getDateValue(result.JSONDateVariable)
于 2018-05-11T12:28:03.803 回答
3

试试这个...

function formatJSONDate(jsonDate) {
            var date = jsonDate;
            var parsedDate = new Date(parseInt(date.toString().substring(6)));
            var newDate = new Date(parsedDate);
            var getMonth = newDate.getMonth() + 1;
            var getDay = newDate.getDay();
            var getYear = newDate.getFullYear(); 

            var standardDate = (getMonth<10 ? '0' : '') + getMonth + '/' + (getDay<10 ? '0' : '') + getDay + '/' + getYear;
            return standardDate;
        }

getYear() 返回年份 - 1900,这已经被弃用了一段时间,最好使用 getFullYear()

于 2018-07-06T10:43:09.180 回答
2

将 JSON 日期转换为 JavaScript 日期很容易:

var s = Response.StartDate;     
s = s.replace('/Date(', '');

s = s.replace(')/', '');

var expDate = new Date(parseInt(s));
于 2012-12-10T09:39:06.703 回答
0

如果您使用的是 Kotlin,那么这将解决您的问题。

val dataString = "/Date(1586583441106)/"
val date = Date(Long.parseLong(dataString.substring(6, dataString.length - 2)))
于 2020-04-15T18:25:12.273 回答
-6

您的 JSON 可能应该返回某种对象(嗯,它的字符串表示形式)。

"{ myDate : Date(1224043200000) }"

使用 jQuery,您可以通过以下方式访问数据对象:

$.get(
    "myJSONFile.php",
    function (data) {
        // data.myDate will be a date object.

        // to show in a short date format (eg: dd/mm/yyyy)
        alert (
            data.myDate.getDate() + "/"
            + (data.myDate.getMonth() + 1) + "/"
            + data.myDate.getFullYear()
        ); // alerts: "15/10/2008"
    }
);
于 2008-10-16T03:47:12.733 回答