如何格式化Microsoft JSON日期?


1999

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

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


26
:这可能是有趣的hanselman.com/blog/...
citronas

6
/Date(...)/格式特定于Microsoft内置的JSON Date格式-它不是任何标准的一部分,并且来自Javascript的JSON具有一个标准:ISO格式的Javascript指定:stackoverflow.com/a / 15952652/176877 因此,此问题特定于Microsoft的JSON日期格式。我修改了标题以澄清这一点。
克里斯·莫斯奇尼

15
你在开玩笑!微软在JSON上加盖了自己的特色!和日期!他们什么时候学习!
Nick.McDermaid '16

在.NET端使用Newtonsoft JSON,在JS端使用漂亮的类型化值,只需使用:github.com/RickStrahl/json.date-extensions
baHI,2017年

您可以使用JSON ++而不是JSON。JSON ++ 与JSON相同,但支持JavaScript类型,例如Date
brillout

Answers:


1688

eval()没有必要。这将正常工作:

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

substr()函数取出该/Date(部分,然后该parseInt()函数获取整数并)/在最后忽略。结果数将传递到Date构造函数中。


我故意省略了基数(的第二个参数parseInt);见下面我的评论

另外,我完全同意Rory的评论:ISO-8601日期比该旧格式更受青睐-因此,通常不应将这种格式用于新开发。有关使用ISO-8601格式序列化日期的绝佳选择,请参见出色的Json.NET库。

对于ISO-8601格式的JSON日期,只需将字符串传递给Date构造函数即可:

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

4
@Broam:如果MS更改格式,则两种方法(替换功能和此答案)都必须更改。
罗伊·廷克

23
您能否用基数var date = new Date(parseInt(jsonDate.substr(6),10))更新它?
詹姆斯·基伯兹

6
@JamesKyburz:每个规则都有例外,我认为这是适用例外的时候。.NET的JSON日期数字永远不会以“ 0”开头,因此我们可以放心地忽略基数。
罗伊·廷克

22
值得注意的是,这种日期格式非常糟糕,通常是将JSON转换为ISO-8601格式的日期。参见hanselman.com/blog/…–
罗里(Rory)

4
此方法无法考虑时区,因此当服务器和用户位于不同时区时,可能会导致严重问题。我在下面发布了一个答案,该答案说明了在WCF和Javascript方面解决该问题的一种非常快速便捷的方法:stackoverflow.com/a/10743718/51061
Scott Willeke,

135

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

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

然后,您可以使用JavaScript日期格式脚本(最小化并压缩后为1.2 KB)来根据需要显示它。


7
这行没有错,顺序是\ //。第一个斜杠被转义,因此它不像注释一样计数。这是您的编辑器在欺骗您,该行将正常运行。
andreialecu

152
@rball,胡说八道:jsonDate = new Date(+jsonDate.replace(/\/Date\((\d+)\)\//, '$1'));
失眼

39
pst是正确的,有可能以多种方式执行此操作而无需“评估”。Crockford说“ eval Is Evil”是因为它的可读性和安全性较低,此外,他还可能暗示它效率低下,并且更危险,因为它会破坏javascript编译器。
马克·罗杰斯

13
@Edy:new Function几乎一样糟糕evaldev.opera.com/articles/view/efficient-javascript/...
马塞尔Korpel

5
@Edy:那是评估的另一种形式,就像“邪恶”一样。而是解析字符串(请参见下面的答案)
Roy Tinker

98

对于使用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"

最后,一些将ISO日期转换为JavaScript日期的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);

6
JavaScript Date构造函数可以为您解析字符串:new Date("2009-04-12T20:44:55")
David Hogue

5
警告-Date()构造函数的格式和解析在ECMAScript 6之前是非标准的。例如,即使在IS0-8601中,IE 9也会将您为构造函数提供的日期视为本地时间,在其他任何地方都将其表示为UCT。如果您支持较旧的浏览器,请不要依赖日期构造函数。 codeofmatt.com/2013/06/07/…– DanO 2014
17:56

发送非UTC日期迟早会给您带来麻烦。
tymtam'7

到这里参加聚会有点晚,但是会怎么样(+ a [1],+ a [2]-1,+ a [3],+ a [4],+ a [5],+ a [6]) ; 在这种情况下代表?
yanant

@yanant- +a[1]等代表正则表达式的数组部分,并且+将其转换为数字,因此+a[1]等于2009等。这是数组的详细信息: 0: "2009-04-12T20:44:55" 1: "2009" 2: "04" 3: "12" 4: "20" 5: "44" 6: "55"
Jason Jong

67

原始示例:

/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; }
    ...
}

从服务中以Json形式返回“ Field2”作为值时:

/Date(1224043200000-0600)/

请注意,时区偏移量是该值的一部分。

修改后的正则表达式:

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

它稍微更热切,并且抓住了括号之间的所有内容,而不仅仅是第一个数字。产生的时间为1970,加上时区偏移量都可以输入到eval中以获取日期对象。

用于替换的JavaScript代码如下:

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

10
这是错误的,新的Date(1224043200000-0600)只会从日期中减去600,在这种情况下为600毫秒,而不是应该的6个小时。
ariel


我认为仅当.NET中的DateTime对象具有时区时,才包括时区偏移量(这是默认行为)。如果您的日期使用UTC,请使用DateTime.SpecifyKind(date,DateTimeKind.UTC),当它序列化时,您将获得正确的UTC值,没有偏移量,然后可以根据需要将其转换回用户的时区。如果在当地时间,请使用.ToUniversalTime()并将其转换为UTC,并已为您指定了“种类”。
jvenema

在javascript -0100中将是二进制字符串,所以要小心!
2015年

一旦将日期从WCF转换为JS,如何撤消。您必须将日期传递为整数(使用date.getTime()),并将其传递给同一WCF?
NitinSingh

65

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

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

无论如何。如果您不想一遍又一遍地重复日期转换代码,建议您阅读此博客文章,并获取使您的生活更轻松的代码。


61

如果您用JavaScript讲,

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

您会看到这是正确的日期,并且可以在任何框架的JavaScript代码中的任何地方使用该日期。


3
那也是我本来会想到的,除了它最终是:var thedate = / Date(1224043200000)/; 至少对我来说...
rball

2
在Chrome和Firefox中,Date()和Date(1224043200000)都给出相同的结果。不知道这是否适用于旧的浏览器,但是此答案现在不适用于浏览器。
詹姆斯

@James,是的,它给浏览器提供了当前日期。:(
vissu 2012年

9
您需要将其写为“新日期(1224043200000)”。
BrainSlugs83 2012年

60

点击此处查看演示

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”


只是上述方法的一种改进。函数formatearFecha(fec){var value = new Date(parseInt(fec.replace(/(^。*()|([+-]。* $$ / g,'')))); var mes = value.getMonth (); var dia = value.getDate(); var date = dia +“ /” + mes +“ /” + value.getFullYear();如果(dia <10)date = date.substr(0,0)+ '0'+ dia + date.substr(1);如果(mes <10)date = date.substr(0,3)+'0'+ mes + date.substr(4);返回日期;}日期格式为ddMMyyyy。干杯!
Matias

38

更新

我们有一个内部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日期或修改为始终具有3毫秒位置的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解析中很有用,这样您就可以获得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');
    },
    ...
});

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

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

不幸的是,您必须切换到较旧的评估路线才能在全球范围内就地解析日期-否则,您需要在解析后根据具体情况对它们进行转换。


27

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


这是不正确的,JSON使用Javascript日期,并添加了时区信息-纪元与javascript Date类的纪元相同(出于明显的原因)。
BrainSlugs83

3
@ BrainSlug83-此答案为JSON没有内置日期类型的断言提供了参考。如果您不同意,请提供替代参考。(您没有想到一个特定的框架已决定使用字符串格式来表示日期吗?这不是JSON标准的一部分,的确不是,因为那样就不可能包含一个不包含日期的字符串。应该被当作一个日期,但是碰巧有一组与日期模式匹配的字符。)
nnnnnn 2013年

25

我还必须寻找解决此问题的方法,最终我遇到了moment.js,这是一个不错的库,可以解析此日期格式以及更多其他内容。

var d = moment(yourdatestring)

它为我省去了一些麻烦,因此我想与您分享。:)
您可以在这里找到有关它的更多信息:http : //momentjs.com/


24

我最终在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)');

我使用原型,并使用我添加的

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

22

在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发送所有日期(应该这样做);消费者然后获得一个JavaScript Date对象,该对象具有适当的ticks值来反映这一点。也就是说,getUTCHours()在日期上调用,等将返回与服务器上相同的值,并且调用getHours()将在用户的本地时区(由其浏览器确定)中返回该值。

尽管这相对容易添加,但这并未考虑到具有时区偏移量的WCF格式。


请注意:为了使代码正常工作,您必须创建字符串类型的startsWith方法
Hugo Zapata

21

使用jQuery UI datepicker-仅在您已经包含jQuery UI时才有意义:

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

输出:

2008年10月15日



18

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

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

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

当然,您必须确保对话的两端在格式(年,月,日)上以及哪个字段应为日期方面达成共识,但是它具有完全避免日期问题的优点。到字符串的转换。全部都是数字-完全没有字符串。另外,使用顺序:年,月,日还可以按日期正确排序。

只是想在这里跳出框框-JSON日期不必存储为字符串。

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


还有就是在JSON,这是RFC 3339格式的日期的标准格式。
gnasher729

@gnasher,那很好,但事实并非如此。没有从RFC 7159到3339的引用,反之亦然。没有法律上标准的JSON日期格式。剩下的只是事实上的标准,每个标准都有优点/缺点。这是关于标准的好处。
Marc L.

17

在真棒线程中发布:

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

1
好主意,但是如果包含时区偏移怎么办?最好在这种情况下使用substr(6)代替slice(6,-2)-请参阅下面的答案。
罗伊·廷克

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等。


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

有没有不使用jQuery库的另一种选择?


这是一个新问题,应作为自己的问题提出,而不应嵌入此处。
Spencer Sullivan

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

10

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

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;
}

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

9

我得到这样的日期:

"/Date(1276290000000+0300)/"

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

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

等等

所以我想出了以下RegExp:

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

最终的代码是:

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

希望能帮助到你。

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

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


1
正则表达式的替换速度很慢...使用substr(6)捕获整数部分并将其传递给parseInt()的速度要快得多-请参阅下面的答案。
罗伊·廷克

还可以查看毫秒和时区
Bergi 2012年

9

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

yyyy.MM.ddThh:mm

它变成了2008.11.20T22:18


根据JSON架构,“日期时间”格式对应于RFC 3339第5.6节。因此,您应该在格林尼治标准时间(GMT)中为日期写“ yyyy-MM-ddTHH:mm:ssZ”,或者将Z替换为类似+ hh:mm的时区。
gnasher729 2014年

问题是WCF和其他“旧的” MS JSON序列化不使用此格式,因此必须加以考虑。
Marc L.

9

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

是否为DateTime自定义JavaScriptConverter?

我必须强调罗伊·廷克(Roy Tinker)评论的准确性。这不是合法的JSON。这是服务器上的一个肮脏的黑客,可以在JavaScript成为问题之前消除该问题。它将阻塞JSON解析器。我用它来起步,但是我不再使用它了。但是,我仍然觉得最好的答案在于更改服务器格式化日期的方式,例如,其他地方提到的ISO。


2
那不是合法的JSON。仅在使用Java解释器评估时才有效。但是,如果您使用的是JSON解码器,它会阻塞。
罗伊·廷克

1
同意 而且,如果我只是处理这一数据,我将不会考虑。但是,如果我要处理一个具有多个日期和其他属性的对象,则将eval()整个对象比一次选择一个属性要容易得多。最后,根本问题是缺少(合法的)JSON日期。在此之前,我们只能进行创造性的研究。
StarTrekRedneck 2010年

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应用程序项目创建的自定义类。


因此,每次添加新角色[Authorize(Roles =“ Human Resources”)]时,都必须进行编译和部署?哇.... :)
Alex Nolasco 2010年

1
如果这是JSON服务,则重定向似乎是错误的。如果输入键非常无效以致于无法找到它,我将返回404 Not Found(如果确实找不到它,则返回404)。当我的用户未登录时,我返回403禁止。
理查德·科菲尔德

这是一种“可重用”的方法。例如,如果我想从另一个View获取用户数据,则只要提供Id就可以获取它。但是,如果未提供ID,则页面会重定向到用户列表(索引)以选择用户。该应用程序需要一个简单的解决方案,就像当时我的大脑熟透的方式一样。
雷林德

8

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


8

Mootools解决方案:

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

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


8
var obj = eval('(' + "{Date: \/Date(1278903921551)\/}".replace(/\/Date\((\d+)\)\//gi, "new Date($1)") + ')');
var dateValue = obj["Date"];

8

在页面中添加jQuery UI插件:

function DateFormate(dateConvert) {
    return $.datepicker.formatDate("dd/MM/yyyy", eval('new ' + dateConvert.slice(1, -1)));
};

8

如果.NET返回...

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

然后在JavaScript中...

var x = new Date("2013-09-17 15:18:53Z");
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.