Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jquery 如何格式化Microsoft JSON日期?_Jquery_Asp.net_Ajax_Json - Fatal编程技术网

Jquery 如何格式化Microsoft JSON日期?

Jquery 如何格式化Microsoft JSON日期?,jquery,asp.net,ajax,json,Jquery,Asp.net,Ajax,Json,我第一次尝试jQuery。我正在将数据放到我的页面上,但是对于日期数据类型返回的JSON数据,我遇到了一些问题。基本上,我得到了一个字符串,看起来像这样: /Date(1224043200000)/ yyyy.MM.ddThh:mm 从一个对JSON完全陌生的人-我如何将其格式化为短日期格式?这应该在jQuery代码中的某个地方处理吗?我使用$.datepicker.formatDate()尝试了jQuery.UI.datepicker插件,但没有成功 仅供参考:以下是我结合以下答案提出的解

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

/Date(1224043200000)/
yyyy.MM.ddThh:mm
从一个对JSON完全陌生的人-我如何将其格式化为短日期格式?这应该在jQuery代码中的某个地方处理吗?我使用
$.datepicker.formatDate()
尝试了
jQuery.UI.datepicker
插件,但没有成功

仅供参考:以下是我结合以下答案提出的解决方案:

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

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

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

如果您使用JavaScript

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

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

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

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

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

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

/Date(1224043200000)/
yyyy.MM.ddThh:mm
它变为
2008.11.20T22:18

var newDate = dateFormat(jsonDate, "mm/dd/yyyy"); 
如果不使用jQuery库,还有其他选项吗?

我最后将“字符”添加到Panos的正则表达式中,以消除Microsoft serializer在将对象写入内联脚本时生成的字符:

所以如果你的C#中有一个属性

protected string JsonObject { get { return jsSerialiser.Serialize(_myObject); }}
var myObject = '{"StartDate":"\/Date(1255131630400)\/"}';
在你的aspx里你有

<script type="text/javascript">
    var myObject = '<%= JsonObject %>';
</script>
注意双引号

为了将其转换为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);
}

一篇迟到的帖子,但是对于那些搜索过这篇帖子的人来说

想象一下:

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

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

原始示例:

/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
它更急切地抓住了双方之间的一切,而不仅仅是第一个数字。产生的1970年以来的时间,加上时区偏移,都可以输入到eval中,以获得一个日期对象

替换的JavaScript结果行是:

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

对于使用Newtonsoft的用户,请阅读如何通过

另外,Json.NET编写的关于更改日期格式的文档也很有用:

对于那些太懒惰的人,这里有一些快速的步骤。由于JSON有一个松散的日期时间实现,您需要使用
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);
$(“”).text(isodaterevivier(item.fieldName).toLocaleString()).appendTo(“#”+divName);
eval()
不是必需的。这可以正常工作:

var date = new Date(parseInt(jsonDate.substr(6)));
substr()
函数取出
/Date(
部分,
parseInt()
函数获取整数,并忽略结尾处的
)/
。生成的数字被传递到
日期
构造函数中


我故意省略了基数(parseInt的第二个参数);请参阅

此外,我完全同意:ISO-8601日期优先于此旧格式-因此此格式通常不应用于新开发

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

var date = new Date(jsonDate); //no ugly parsing needed; full timezone support
Mootools解决方案:

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

需要更多mootools。在Firefox 3.6.3和IE 7.0.5730.13上使用mootools-1.2.3.1-more进行测试,供任何在服务器端使用Python的人参考:datetime.datetime().ctime()返回一个本机可由“new Date()”解析的字符串。也就是说,如果您创建了一个新的datetime.datetime实例(例如使用datetime.datetime.now),该字符串可以包含在JSON字符串中,然后该字符串可以作为第一个参数传递给日期构造函数。我还没有发现任何异常,但我也没有对其进行过严格的测试。

我得到的日期如下所示:

"/Date(1276290000000+0300)/"
在某些示例中,日期的格式略有不同:

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

因此,我提出了以下RegExp:

/\/+Date\(([\d+]+)\)\/+/
最后的代码是:

var myDate = new Date(parseInt(jsonWcfDate.replace(/\/+Date\(([\d+-]+)\)\/+/, '$1')));
希望能有帮助

更新: 我从Microsoft找到此链接:


这似乎是我们所有人都在寻找的主题。

在Aweasome thread中发布:

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

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

我必须强调Roy Tinker评论的准确性。这不是合法的JSON。这是对ser的肮脏、肮脏的攻击
function parseMSDate(s) {
    // Jump forward past the /Date(, parseInt handles the rest
    return new Date(parseInt(s.substr(6)));
}
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;
}
function parseIsoDate(s) {
    return new Date(s);
}
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;
}
function parseDate(s) {
    var d;
    if (looksLikeMSDate(s))
        d = parseMSDate(s);
    else if (looksLikeIsoDate(s))
        d = parseIsoDate(s);
    else
        return null;

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

$.ajax({
    ...
    dataFilter: function(d) {
        return d.replace(/"\\\/(Date\(-?\d+\))\\\/"/g, 'new $1');
    },
    ...
});
(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);
        }
      }
    });
}());
{ "name":"Nick",
  "birthdate":[1968,6,9] }
var obj = eval('(' + "{Date: \/Date(1278903921551)\/}".replace(/\/Date\((\d+)\)\//gi, "new Date($1)") + ')');
var dateValue = obj["Date"];
$.datepicker.formatDate('MM d, yy', new Date(parseInt('/Date(1224043200000)/'.substr(6)))); 
new MyInfo {
    CreationDate = r.CreationDate.ToString("o"),
};
$.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());
    }
)
function DateFormate(dateConvert) {
    return $.datepicker.formatDate("dd/MM/yyyy", eval('new ' + dateConvert.slice(1, -1)));
};
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;
}
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();
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;
}
moment.lang('de');
var d = moment(yourdatestring)
return DateTime.Now.ToString("u"); //"2013-09-17 15:18:53Z"
var x = new Date("2013-09-17 15:18:53Z");
 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();
    }