Vraag Hoe formatteer ik een Microsoft JSON-datum?


Ik ga mijn eerste crack aan Ajax met jQuery. Ik krijg mijn gegevens op mijn pagina, maar ik ondervind problemen met de JSON-gegevens die worden geretourneerd voor datumgegevenstypen. Kortom, ik krijg een string terug die er zo uitziet:

/Date(1224043200000)/

Van iemand die helemaal nieuw is in JSON - Hoe formatteer ik dit naar een kort datumformaat? Moet dit ergens in de jQuery-code worden afgehandeld? Ik heb de jQuery.UI.datepicker plugin gebruiken $.datepicker.formatDate() zonder enig succes.

Ter info: Dit is de oplossing die ik bedacht heb met een combinatie van de antwoorden hier:

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

Deze oplossing kreeg mijn object van de callback-methode en gaf de datums op de pagina correct weer met de bibliotheek voor datumnotaties.


1788


oorsprong


antwoorden:


Eval is niet nodig. Dit werkt prima:

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

De substr-functie haalt de "/ Date (" part weg, en de parseInt-functie krijgt het gehele getal en negeert de ") /" aan het einde. Het resulterende nummer wordt doorgegeven aan de constructor Date.

EDIT: Ik heb opzettelijk de radix weggelaten (het 2e argument om te parsen); zien mijn reactie hieronder. Ook ben ik het volledig met hem eens Rory's opmerking: ISO-8601-datums hebben de voorkeur boven dit oude formaat, dus dit formaat moet over het algemeen niet worden gebruikt voor nieuwe ontwikkeling. Zie het uitstekende Json.NET bibliotheek voor een geweldig alternatief dat datums serialiseert met behulp van het ISO-8601-formaat.

Voor ISO-8601 geformatteerde JSON-datums geeft u de tekenreeks gewoon door aan de constructor Date:

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

1565



U kunt dit gebruiken om een ​​datum te krijgen van JSON:

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

En dan kunt u gebruiken een JavaScript-datumformaat script (1,2 KB indien geminimaliseerd en gzipped) om het weer te geven zoals je wilt.


115



Voor degenen die Newtonsoft gebruiken Json.NET, lees hoe je het via kunt doen Native JSON in IE8, Firefox 3.5 plus Json.NET.

Ook de documentatie over het wijzigen van het datumnotatie van Json.NET is nuttig: Seriedata met Json.NET

Voor degenen die te lui zijn, hier zijn de snelle stappen. Omdat JSON een losse DateTime-implementatie heeft, moet u de IsoDateTimeConverter(). Merk op dat sinds Json.NET 4.5 de standaard datumindeling ISO is, zodat de onderstaande code niet nodig is.

string jsonText = JsonConvert.SerializeObject(p, new IsoDateTimeConverter());

De JSON zal doorkomen als

"fieldName": "2009-04-12T20:44:55"

Eindelijk wat JavaScript om de ISO-datum naar een JavaScript-datum te converteren:

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

Ik heb het zo gebruikt

$("<span />").text(isoDateReviver(item.fieldName).toLocaleString()).appendTo("#" + divName);

84



Het originele voorbeeld:

/Date(1224043200000)/  

geeft niet de indeling weer die door WCF wordt gebruikt bij het verzenden van datums via WCF REST met behulp van de ingebouwde JSON-serialisatie. (tenminste op .NET 3.5, SP1)

Ik vond het antwoord hier nuttig, maar een kleine bewerking van de regex is vereist, omdat het lijkt alsof de tijdzone GMT-offset wordt toegevoegd aan het nummer dat is geretourneerd (sinds 1970) in WCF JSON.

In een WCF-service heb ik:

[OperationContract]
[WebInvoke(
    RequestFormat = WebMessageFormat.Json,
    ResponseFormat = WebMessageFormat.Json,
    BodyStyle = WebMessageBodyStyle.WrappedRequest
    )]
ApptVisitLinkInfo GetCurrentLinkInfo( int appointmentsId );

ApptVisitLinkInfo wordt eenvoudigweg gedefinieerd:

public class ApptVisitLinkInfo {
    string Field1 { get; set; }
    DateTime Field2 { get; set; }
    ...
}

Wanneer "Field2" wordt geretourneerd als Json van de service, is de waarde:

/Date(1224043200000-0600)/

Let op de tijdzone-offset die deel uitmaakt van de waarde.

De gewijzigde regex:

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

Het is iets meer enthousiast en grijpt alles tussen de parens, niet alleen het eerste nummer. De resulterende tijd sinze 1970, plus timezone offset kan allemaal worden ingevoerd in de eval om een ​​datumobject te krijgen.

De resulterende regel JavaScript voor de vervanging is:

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

57



Herhaal jezelf niet - automatiseer datumconversie met $.parseJSON()

Antwoorden op uw bericht bieden handmatige datumconversie naar JavaScript-datums. Ik heb jQuery's uitgebreid $.parseJSON() gewoon een klein beetje, dus het is in staat om automatisch datums te ontleden wanneer u het opdraagt. Het verwerkt ASP.NET-opgemaakte datums (/Date(12348721342)/) en ISO-opgemaakte datums (2010-01-01T12.34.56.789Z) die worden ondersteund door native JSON-functies in browsers (en bibliotheken zoals json2.js).

Hoe dan ook. Als u uw datumconversiecode niet steeds opnieuw wilt herhalen, raad ik u aan dit te lezen deze blog post en krijg de code die je leven een beetje makkelijker zal maken.


53



Als je in JavaScript zegt,

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

u zult zien dat dit de juiste datum is, en u kunt dat overal gebruiken in JavaScript-code met elk raamwerk.


50



Klik hier om de demo te bekijken

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

Resultaat - "10/15/2008"


46