Як наладзіць дату Microsoft JSON?

Я бяру сваю першую расколіну ў Ajax з дапамогай jQuery. Я атрымліваю свае дадзеныя на сваёй старонцы, але ў мяне ўзнікаюць некаторыя праблемы з дадзенымі JSON, якія вяртаюцца для тыпаў дадзеных Date. У прынцыпе, я атрымліваю радок назад, якая выглядае так:

 /Date(1224043200000)/ 

Ад каго-то цалкам новага для JSON - Як мне адфарматаваць гэты фармат да кароткага фармату? Ці павінна гэта апрацоўвацца дзе-небудзь у кодзе jQuery? Я спрабаваў убудова jQuery.UI.datepicker , выкарыстоўваючы $.datepicker.formatDate() без якіх-небудзь поспехаў.

FYI: Тут рашэнне, якое я прыдумаў, выкарыстоўвае камбінацыю адказаў тут:

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

Гэта рашэнне атрымала мой аб'ект з метаду зваротнага выкліку і правільна адлюстроўвалі даты на старонцы, выкарыстоўваючы бібліятэку фармату даты.

1817
15 окт. зададзены Mark Struzinski 15 каст. 2008-10-15 23:43 '08 у 23:43 2008-10-15 23:43
@ 39 адказаў
  • 1
  • 2

Eval не патрабуецца. Гэта будзе нармальна працаваць:

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

Функцыя substr вымае "/ Date (" part ", а функцыя parseInt атрымлівае цэлы лік і ігнаруе") / "у канцы. Атрыманае лік перадаецца ў канструктар Date.

Рэдагаваць: Я наўмысна выпусціў падстава (другі аргумент parseInt); см. мой каментар ніжэй . Акрамя таго, я цалкам згодны з каментаром Rory : даты ISO-8601 пераважней гэтага старога фармату, таму гэты фармат звычайна не павінен выкарыстоўвацца для новай распрацоўкі. См. Выдатную бібліятэку Json.NET для выдатнай альтэрнатывы, якая сериализует даты з выкарыстаннем фармату ISO-8601.

Для ISO-8601 адфарматаваных дат JSON проста перадайце радок у канструктар Date:

 var date = new Date(jsonDate); //no ugly parsing needed; full timezone support 
1587
23 февр. адказ дадзены Roy Tinker 23 февр. 2010-02-23 07:15 '10 ў 7:15 2010-02-23 07:15

Вы можаце выкарыстоўваць гэта, каб атрымаць дату ад JSON:

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

І затым вы можаце выкарыстоўваць фармат даты JavaScript Script (1,2 КБ пры мініраванні і gzipped), каб адлюстроўваць яго, як вы хочаце.

117
16 окт. адказ дадзены Panos 16 каст. 2008-10-16 00:14 '08 у 0:14 2008-10-16 00:14

Для тых, хто выкарыстоўвае Newtonsoft Json.NET , прачытайце, як гэта зрабіць з дапамогай Убудаваны JSON ў IE8, Firefox 3.5 плюс Json.NET .

Таксама карысная дакументацыя па змене фармату дат, напісаных 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); 
86
19 янв. адказ дадзены Jason Jong 19 студз. 2010-01-19 07:53 '10 у 07:53 2010-01-19 07:53

Зыходны прыклад:

 /Date(1224043200000)/ 

не адлюстроўвае фарматаванне, якое выкарыстоўваецца WCF пры адпраўцы дат праз WCF REST, выкарыстоўваючы убудаваную Серыялізацыя JSON. (Прынамсі, на .NET 3.5, SP1)

Я знайшоў адказ карысным, але патрабуецца невялікая рэдагаванне ў рэгулярным выразе, так як здаецца, што зрушэнне гадзінны пояс GMT дадаецца да вяртаеце нумары (з 1970 года) у WCF JSON.

У службе 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; } ... } 

Калі "Поле2" вяртаецца як Json са службы, гэта значэнне:

 /Date(1224043200000-0600)/ 

Звярніце ўвагу, што зрушэнне гадзіннага пояса ўключана як частка значэння.

Змененае рэгулярны выраз:

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

Ён крыху больш нецярплівы і захоплівае ўсё, што ёсць паміж parens, а не толькі першае чысло. Атрыманае ў выніку час sinze 1970, плюс зрушэнне гадзіннага пояса, могуць быць перададзены ў eval для атрымання аб'екта даты.

Выніковая радок JavaScript для замены:

 replace(/\/Date\((.*?)\)\//gi, "new Date($1)"); 
57
30 дек. адказ дадзены Aaron 30 снеж. 2009-12-30 04:21 '10 у 04:21 2009-12-30 04:21

Ня паўтарайце сябе - аўтаматызуе пераўтварэнне даты з дапамогай $.parseJSON()

Адказы на ваша паведамленне прадастаўляюць ручное пераўтварэнне даты ў даты JavaScript. Я крыху пашырыў jQuery $.parseJSON() , каб ён мог аўтаматычна аналізаваць даты, калі вы яго инструктируете. Ён апрацоўвае даты фарматавання ASP.NET ( /Date(12348721342)/ ), а таксама даты ў фармаце ISO ( 2010-01-01T12.34.56.789Z ), якія падтрымліваюцца ўбудаванымі функцыямі JSON ў браўзэрах (і бібліятэкамі, такімі як json2.js ).

У любым выпадку. Калі вы не хочаце паўтараць код пераўтварэнні даты зноў і зноў, я прапаную вам прачытаць гэты пост у блогу і атрымаць код, які зробіць вашу жыццё крыху лягчэй.

55
27 дек. адказ дадзены Robert Koritnik 27 снеж. 2010-12-27 19:21 '11 у 19:21 2010-12-27 19:21

Калі вы кажаце ў JavaScript,

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

вы ўбачыце, што гэта правільная дата, і вы можаце выкарыстоўваць гэта ў любым месцы кода JavaScript з любой каркасам.

52
15 окт. адказ дадзены John Boker 15 каст. 2008-10-15 23:49 '08 у 23:49 2008-10-15 23:49

Націсніце тут, каб праверыць дэманстрацыю

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"

49
17 марта '13 в 20:41 2013-03-17 20:41 адказ дадзены user2007801 17 сакавіка '13 а 20:41 2013/03/17 20:41

абноўлены

У нас ёсць унутраная бібліятэка карыстацкага інтэрфейсу, якая павінна адпавядаць як ўбудаванаму фармату JSON для Microsoft ASP.NET, напрыклад /Date(msecs)/ , так і /Date(msecs)/ тут, і большасці фармату даты JSON, уключаючы JSON.NET, напрыклад, 2014-06-22T00:00:00.0 . Акрамя таго, нам трэба справіцца з няздольнасцю oldIE спраўляцца з чым заўгодна, акрамя трох знакаў пасля коскі .

Спачатку мы вызначаем, якую дату мы спажываем, прааналізуем яе ў звычайным аб'екце 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) Фармат даты сінтаксісу:

 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 ym-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 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; } to be function parseIsoDate(s) { var m = isoDateRegex.exec(s); // Is this UTC, offset, or undefined? Treat undefined as UTC. if (m.length == 7 || // Just the ym-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 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); } 

Наступны стары адказ карысны для прывязкі гэтага фарматавання даты да JSON-сінтаксічнага аналізу JQuery, таму вы атрымліваеце аб'екты Date замест радкоў, або калі вы ўсё роўна затрымаліся ў jQuery <1.5.

стары адказ

Калі вы выкарыстоўваеце функцыю jQuery 1.4 Ajax з ASP.NET MVC, вы можаце ператварыць усе ўласцівасці 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 ва ўсім свеце, выкарыстоўваючы опцыю converters ў выкліку Ajax.

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

На жаль, вам трэба пераключыцца на больш стары маршрут eval, каб прымусіць Dates аналізаваць глабальна на месцы - у адваротным выпадку вам трэба пераўтварыць іх у больш індывідуальны пост-аналіз.

31
08 февр. адказ дадзены Chris Moschini 08 февр. 2011-02-08 02:56 '11 у 02:56 2011-02-08 02:56

Я скончыў тым, што дадаваў сімвалы ў рэгулярны выраз Panos, каб пазбавіцца ад тых, якія згенераваныя сериализатором Microsoft для запісу аб'ектаў у убудаваны script:

Такім чынам, калі ў вас ёсць ўласцівасць у З # code-behind , нешта накшталт

 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); } 
21
09 окт. адказ дадзены Chris Woodward 09 каст. 2009-10-09 04:03 '09 у 04:03 2009-10-09 04:03

Мне таксама давялося шукаць рашэнне гэтай праблемы, і ў выніку я наткнуўся на moment.js, якая з'яўляецца добрай бібліятэкай, якая можа аналізаваць гэты фармат даты і многае іншае.

 var d = moment(yourdatestring) 

Гэта пазбавіла мяне ад галаўнога болю, таму я падумаў, што падзялюся ёю з табой. :)
Вы можаце знайсці дадатковую інфармацыю пра гэта тут: http://momentjs.com/

21
15 мая '13 в 9:36 2013-05-15 09:36 адказ дадзены Venemo 15 мая '13 у 09:36 2013/05/15 09:36

Няма ўбудаванага тыпу даты ў JSON . Гэта падобна на колькасць секунд / мілісекунд з некаторай эпохі. Калі вы ведаеце эпоху, вы можаце стварыць дату, дадаўшы патрэбную колькасць часу.

20
15 окт. адказ дадзены johnstok 15 каст. 2008-10-15 23:46 '08 у 23:46 2008-10-15 23:46

У 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 , які мае адпаведнае значэнне цікаў, каб адлюстраваць гэта. Гэта значыць пры выкліку getUTCHours() і г.д. У дзень будзе вернута тое ж значэнне, што і на сэрвэры, а выклік getHours() будзе вяртаць значэнне ў карыстацкім лакальным часавым поясе, як вызначана іх браўзэрам.

Гэта не ўлічвае фармат WCF з зрушэннямі гадзіннага пояса, хоць гэта было б адносна лёгка дадаць.

19
08 апр. адказ дадзены Domenic 08 крас. 2011-04-08 04:59 '11 у 04:59 2011-04-08 04:59

Выкарыстанне jQuery UI datepicker - сапраўды мае сэнс, калі вы ўжо ўключаеце jQuery UI:

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

выснову:

15 кастрычніка 2008 г.

17
30 авг. адказ дадзены dominic 30 жнів. 2011-08-30 12:33 '11 у 12:33 2011-08-30 00:33

Не перашчыруйце. Як мы гэта рабілі на працягу дзесяцігоддзяў, перадаем лікавае зрушэнне ад дэ-факта стандартнай эпохі 1 студзеня 1970 года паўночы GMT / UTC / c ў колькасці секунд (або мілісекунд) з гэтай эпохі. JavaScript падабаецца, Java падабаецца, C падабаецца, і Інтэрнэт яму падабаецца.

17
30 окт. адказ дадзены Jé Queue 30 каст. 2009-10-30 07:45 '09 у 7:45 2009-10-30 07:45

Кожны з гэтых адказаў мае адну агульную рысу: усе яны захоўваюць даты як адно значэнне (звычайна гэта радок).

Іншы варыянт - скарыстацца убудаванай структурай JSON і прадставіць дату ў выглядзе спісу лікаў:

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

Вядома, вам трэба будзе пераканацца, што абодва канца размовы супадаюць з фарматам (год, месяц, дзень), а якія поля прызначаныя для дат, ... але ў яго ёсць перавага, каб цалкам пазбегнуць выпуск пераўтварэнні даты ў радок. Ўсе лічбы - ніякіх радкоў. Акрамя таго, з выкарыстаннем парадку: год, месяц, дзень таксама дазваляе правільна сартаваць па даце.

Проста думаючы па-за скрынкі тут - дата JSON не павiнна захоўвацца ў выглядзе радка.

Яшчэ адзін бонус для гэтага заключаецца ў тым, што вы можаце лёгка (і эфектыўна) выбіраць усе запісы за дадзены год ці месяц, выкарыстоўваючы спосаб CouchDB апрацоўвае запыты па значэннях масіва.

16
17 июня '11 в 6:54 2011-06-17 06:54 адказ дадзены Nick Perkins 17 чэрвеня '11 у 6:54 2011-06-17 06:54

Праводка ў awesome thread:

 var d = new Date(parseInt('/Date(1224043200000)/'.slice(6, -2))); alert('' + (1 + d.getMonth()) + '/' + d.getDate() + '/' + d.getFullYear().toString().slice(-2)); 
15
26 сент. адказ дадзены Dan Beam 26 сент. 2010-09-26 14:20 '10 у 14:20 2010-09-26 14:20

Каб дадаць іншы падыход тут, падыход "цікаў", які WCF , схільны праблемах з вартавымі паясамі, калі вы не вельмі асцярожныя напрыклад, тут і ў іншых месцах. Таму я цяпер выкарыстоўваю фармат ISO 8601, які падтрымлівае як .NET, так і JavaScript, уключаючы зрушэння гадзінных паясоў. Ніжэй прыведзены дэталі:

У WCF / .NET:

Дзе CreationDate - System.DateTime; ToString ( "o") выкарыстоўвае .NET Спецификатор фармату round-trip , які генеруе радок даты, адпаведную стандарту 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()); } ) has a CreatedOn field that is a real JavaScript date $.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, такія як toDateString , toLocaleString і г.д.

14
24 мая '12 в 22:01 2012-05-24 22:01 адказ дадзены Scott Willeke 24 мая '12 а 22:01 2012-05-24 22:01
 var newDate = dateFormat(jsonDate, "mm/dd/yyyy"); 

Ці ёсць іншы варыянт без выкарыстання бібліятэкі jQuery?

14
24 сент. адказ дадзены Bilgin Kılıç 24 сент. 2009-09-24 14:38 '09 у 14:38 2009-09-24 14:38
 var obj = eval('(' + "{Date: \/Date(1278903921551)\/}".replace(/\/Date\((\d+)\)\//gi, "new Date($1)") + ')'); var dateValue = obj["Date"]; 
9
01 июля '11 в 11:07 2011-07-01 11:07 адказ дадзены 在路上 01 ліпеня '11 ў 11:07 2011-07-01 11:07

Праверце дату стандарту ISO; накшталт як:

 yyyy.MM.ddThh:mm 

Ён становіцца 2008.11.20T22:18 .

8
20 нояб. адказ дадзены Thomas Hansen 20 лістапада. 2008-11-20 12:18 '08 у 12:18 2008-11-20 00:18

Я атрымліваю такую ​​дату:

 "/Date(1276290000000+0300)/" 

У некаторых прыкладах дата знаходзіцца ў некалькі розных фарматах:

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

і інш.

Такім чынам, я прыдумаў наступны RegExp:

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

а канчатковы код:

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

Спадзяюся, што гэта дапаможа.

Абнаўленне: Я знайшоў гэтую спасылку ад Microsoft: Як прызначыць даты з дапамогай JSON?

Гэта падобна на той, які мы ўсе шукаем.

7
26 сент. адказ дадзены Michael Vashchinsky 26 сент. 2010-09-26 14:07 '10 у 14:07 2010-09-26 14:07

Гэта хвалюе. Маё рашэнне складалася ў тым, каб разабраць "/ і /" з значэння, згенераванага ASP.NET JavaScriptSerializer, так што, хоць JSON можа і не мець литерала даты, ён усё роўна інтэрпрэтуецца браўзэрам як дата, а гэта тое, што я сапраўды хочаце : {"myDate":Date(123456789)}

Карыстацкі JavaScriptConverter для DateTime?

Я павінен падкрэсліць дакладнасць каментара Роя Тинкера. Гэта не законны JSON. Гэта брудны брудны хак на сэрвэры, каб выдаліць праблему, перш чым яна стане праблемай для JavaScript. Ён задушыць парсер JSON. Я выкарыстаў яго для таго, каб сысці з зямлі, але я больш не выкарыстоўваю яго. Тым не менш, я па-ранейшаму лічу, што лепшы адказ заключаецца ў змене спосабу фарматавання даты, напрыклад, ISO, як згадвалася ў іншым месцы.

7
14 окт. адказ дадзены StarTrekRedneck 14 каст. 2010-10-14 08:02 '10 у 08:02 2010-10-14 08:02

Ніжэй прадстаўлена даволі простае рашэнне для сінтаксічнага аналізу дат 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; } 
7
09 авг. адказ дадзены Umar Malik 09 жнів. 2012-08-09 15:14 '12 у 15:14 2012-08-09 15:14

Дадайце убудова jQuery UI на сваю старонку:

 function DateFormate(dateConvert) { return $.datepicker.formatDate("dd/MM/yyyy", eval('new ' + dateConvert.slice(1, -1))); }; 
7
29 июня '12 в 15:01 2012-06-29 15:01 адказ дадзены Thulasiram 29 чэрвеня '12 у 15:01 2012-06-29 15:01

Рашэнне Mootools:

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

Патрабуецца mootools-more. Пратэставана з дапамогай mootools-1.2.3.1-more на Firefox 3.6.3 і IE 7.0.5730.13

6
13 мая '10 в 11:02 2010-05-13 11:02 адказ дадзены Midhat 13 мая '10 у 11:02 2010-05-13 11:02

Вы таксама можаце выкарыстоўваць JavaScript library.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.> 
6
15 мая '13 в 9:21 2013-05-15 09:21 адказ дадзены martinoss 15 мая '13 у 09:21 2013/05/15 09:21

Позняя пошта, але для тых, хто шукаў гэтую пасаду.

Уявіце сабе наступнае:

  [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"); } 

Як вы можаце бачыць, я выкарыстоўваю функцыю З # 3.0 для стварэння "Аўта" Generics. Гэта крыху ляніва, але мне яно падабаецца, і яно працуе. Проста заўвага: Профіль - гэта спецыяльны клас, які я стварыў для майго праекта вэб-прыкладанняў.

6
23 окт. адказ дадзены Ray Linder 23 каст. 2009-10-23 09:39 '09 у 09:39 2009-10-23 09:39

FYI, для ўсіх, хто выкарыстоўвае Python на боку сервера: datetime.datetime (). ctime () вяртае радок, якая атрымліваецца ў спадчыну на аснове "новай даты ()". Гэта значыць, калі вы ствараеце новы асобнік datetime.datetime (напрыклад, з datetime.datetime.now), радок можа быць уключаны ў радок JSON, а затым гэты радок можа быць перададзена ў якасці першага аргументу канструктару Date. Я яшчэ не знайшоў ніякіх выключэнняў, але я таксама не правяраў гэта занадта строга.

5
08 июля '10 в 4:19 2010-07-08 04:19 адказ дадзены Kyle Alan Hale 08 ліпеня '10 ў 04:19 2010-07-08 04:19

Што рабіць, калі .NET вяртаецца ...

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

А потым у JavaScript ...

 var x = new Date("2013-09-17 15:18:53Z"); 
5
17 сент. адказ дадзены Juan Carlos Puerto 17 сент. 2013-09-17 22:22 '13 у 22:22 2013/09/17 22:22

Гэта можа таксама дапамагчы вам.

  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(); } 
5
02 февр. адказ дадзены Ravi Mehta 02 февр. 2016-02-02 14:57 '16 у 14:57 2016/02/02 14:57
  • 1
  • 2

Іншыя пытанні па пазнаках або Задайце пытанне