Soru Microsoft JSON tarihini nasıl biçimlendiririm?


İlk çatışımı alıyorum ajax jQuery ile. Verilerimi sayfama yüklüyorum, ancak Tarih veri türleri için döndürülen JSON verileriyle ilgili bir sorun yaşıyorum. Temel olarak, böyle görünen bir ip alıyorum:

/Date(1224043200000)/

Tamamen yeni birisinden JSON'a - Bunu kısa bir tarih biçimine nasıl biçimlendiririm? Bu jQuery kodunda bir yerde ele alınmalıdır? Denedim jQuery.UI.datepicker kullanarak eklenti $.datepicker.formatDate() herhangi bir başarı olmadan.

FYI: İşte cevapların bir kombinasyonunu kullanarak ortaya çıktığım çözüm:

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

Bu çözüm, nesneyi geri arama yönteminden aldı ve tarih biçimini kitaplık kullanarak düzgün bir şekilde sayfada görüntüler.


1793


Menşei


Bu ilginç olabilir: hanselman.com/blog/... - citronas
/Date(...)/ formatı Microsoft'un yerleşik JSON Date formatına özgüdür - herhangi bir standardın parçası değildir ve Javascript'ten gelen JSON bir standarda sahiptir: ISO formatı Javascript şunları belirtir: stackoverflow.com/a/15952652/176877  Yani, bu soru Microsoft'un JSON Tarih formatına özgüdür. Bunu açıklığa kavuşturmak için başlığı değiştirdim. - Chris Moschini
Dalga geçiyorsun! Microsoft kendi dönüşlerini JSON'da damgaladı! ve tarihlerinde! Ne zaman öğrenecekler! - Nick.McDermaid
.NET tarafında Newtonsoft JSON kullanın ve JS tarafında güzel yazılan değerlere sahip, sadece kullanın: github.com/RickStrahl/json.date-extensions - baHI


Cevaplar:


Eval gerekli değildir. Bu iyi çalışır:

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

Substr işlevi "/ Date (Tarih)" bölümünü alır ve parseInt işlevi tamsayıyı alır ve sonunda ") /" değerini yoksayar. Ortaya çıkan sayı Date kurucusuna geçirilir.

DÜZENLEME: kasıtlı olarak yarıçap (parseInt için 2. argüman) dışarıda bırakılmıştır; görmek aşağıda yorumum. Ayrıca tamamen katılıyorum Rory'nin yorumu: ISO-8601 tarihleri ​​bu eski formatta tercih edilir - bu nedenle bu format genellikle yeni geliştirme için kullanılmamalıdır. Mükemmel görmek Json.NET ISO-8601 formatını kullanarak tarihleri ​​serileştiren harika bir alternatif için kütüphane.

ISO-8601 formatlı JSON tarihleri ​​için, dizeyi Tarih yapıcısına iletmeniz yeterlidir:

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

1566



@Broam: MS formatı değiştirirse, her iki yöntem de (değiştirme işlevi ve bu cevap) değişecektir. - Roy Tinker
@LeeWhitney: Evet, ancak soneki (zaman dilimi ofseti olan) yok sayılır. ParseInt işlevi, sayısal olmayan bir karakterle veya dizenin sonuyla karşılaşana kadar, kendisine iletilen dizenin önünden sayıları alır, bu noktada durur ve sayısal sonucu döndürür. - Roy Tinker
Lütfen bunu radix var date = new Date (parseInt (jsonDate.substr (6), 10)) ile günceller misiniz? - James Kyburz
@JamesKyburz: Her kuralın istisnaları vardır ve bence bu bir istisnanın geçerli olduğu zamandır. .NET'ten JSON tarih sayıları asla Önde gelen bir "0" var, bu yüzden güvenli bir şekilde dışarı çıkabiliyoruz. - Roy Tinker
Bu tarih formatının oldukça kötü olduğunu ve genel hareketin JSON'daki ISO-8601 biçimlendirilmiş tarihler olduğunu belirtmekte fayda var. Görmek hanselman.com/blog/... - Rory


JSON'dan bir tarih almak için bunu kullanabilirsiniz:

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

Ve sonra kullanabilirsiniz bir JavaScript Tarih Biçimi betik (minimize edildiğinde ve gziplendiğinde 1,2 KB) istediğiniz gibi gösterilecek.


115



Çizgide yanlış bir şey yok, sıra \ /. İlk eğik çizgi kaçtı, bu yüzden bir yorum gibi sayılmaz. Editörün seni kandırıyor, çizgi iyi çalışıyor. - andreialecu
@rball, saçmalık: jsonDate = new Date(+jsonDate.replace(/\/Date\((\d+)\)\//, '$1')); - eyelidlessness
pst doğruydu, bunu 'eval' olmaksızın çeşitli şekillerde yapmak mümkün. Crockford, 'eval is kötülük' diyor çünkü daha az okunabilir ve daha az güvenlidir, ayrıca javascript derleyicisine vurduğu için daha az verimli ve daha tehlikeli olduğunu ima edebilir. - Mark Rogers
@Edy: new Function neredeyse kadar kötü eval: dev.opera.com/articles/view/efficient-javascript/... - Marcel Korpel
@Edy: Bu bir başka değerlendirmenin şekli ve aynı zamanda 'kötülük'. Bunun yerine dizeyi ayrıştırın (aşağıdaki cevaba bakın) - Roy Tinker


Newtonsoft kullananlar için Json.NET, üzerinden nasıl yapılacağını okuyun IE8'de Yerel JSON, Firefox 3.5 ve Json.NET.

Ayrıca Json.NET tarafından yazılan tarihlerin biçiminin değiştirilmesiyle ilgili belgeler yararlıdır: Json.NET ile seri hale getirme tarihleri

Çok tembel olanlar için, hızlı adımlar burada. JSON'un gevşek bir DateTime uygulaması olduğu için, IsoDateTimeConverter(). Json.NET 4.5'ten itibaren varsayılan tarih formatı ISO olduğundan, aşağıdaki kodun gerekmediğini unutmayın.

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

JSON olarak geçecek

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

Son olarak, ISO tarihini bir JavaScript tarihine dönüştürmek için bazı JavaScript'ler:

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

Bunu böyle kullandım

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

84



JavaScript Date kurucusu sizin için dizeyi ayrıştırabilir: new Date("2009-04-12T20:44:55") - David Hogue
Uyarı - Date () Oluşturucu formatları ve ayrıştırmaları ECMAScript 6'dan önce standart değildir. Örneğin, IE 9 IS0-8601'de olsa bile kurucuya verdiğiniz tarihi yerel saat olarak ele alır. Eski tarayıcıları destekliyorsanız tarih yapıcıya güvenmeyin. codeofmatt.com/2013/06/07/... - DanO
UTC olmayan bir tarih göndermek, er ya da geç size belaya girer. - tymtam


Orijinal örnek:

/Date(1224043200000)/  

yerleşik JSON serileştirmesi kullanılarak WCF REST aracılığıyla tarihler gönderirken WCF tarafından kullanılan formatı yansıtmaz. (en azından .NET 3.5, SP1'de)

Buradaki cevabı yararlı buldum, ancak zaman dilimi GMT ofsetinin WCF JSON'da döndürülen numaraya (1970'den beri) eklendiği görüldüğü için normal ifadeye hafif bir düzenleme yapılması gerekiyor.

Bir WCF hizmetinde sahip olduğum:

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

ApptVisitLinkInfo basitçe tanımlanmıştır:

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

Hizmetten Json olarak "Field2" döndüğünde, değer:

/Date(1224043200000-0600)/

Değerin parçası olarak dahil olan zaman dilimi ofseti dikkat edin.

Değiştirilen düzenli ifade:

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

Biraz daha hevesli ve sadece ilk sayı değil, parens arasındaki her şeyi alır. Ortaya çıkan zaman 1970 sinüz, artı zaman dilimi ofset bir tarih nesne almak için eval içine beslenebilir.

Değiştirmek için ortaya çıkan JavaScript satırı:

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

57



Bu yanlıştır, yeni Tarih (1224043200000-0600) yalnızca 600'ü tarihten çıkarır, bu durumda 600 milisaniye gerekir, 6 saat değil. - ariel
@ariel: Şuna bir göz atın Milisaniye cinsinden Javascript Tarihi ve saat dilimi - Bergi
Saat dilimi ofsetinin yalnızca .NET'teki DateTime nesnesinde bir saat diliminiz varsa (varsayılan davranış olan) eklendiğini düşünüyorum. Tarihiniz UTC'de ise, DateTime.SpecifyKind (date, DateTimeKind.UTC) değerini kullanın ve seri hale getirildiğinde uygun UTC değerini elde edersiniz, ofset olmadan, daha sonra gerektiğinde kullanıcının saat dilimini geri dönüştürebilirsiniz. Yerel saatte ise, .ToUniversalTime () yöntemini kullanın ve UTC'ye dönüşür ve sizin için önceden belirlenmiş olan "Tür" ünüzü bulundurun. - jvenema
javascript -0100 ikili bir dize olacak böylece dikkatli olun! - verbedr
WCF'den JS'ye dönüştürüldüğü tarihi aldığınızda, geriye doğru. Aynı WCF'ye geçmek istediğiniz tamsayı (date.getTime () kullanarak) olmanız gerekir mi? - NitinSingh


Kendinizi tekrarlama - kullanarak tarih dönüşümünü otomatikleştirin $.parseJSON()

Gönderinizdeki yanıtlar, JavaScript tarihlerine manuel tarih dönüşümü sağlar. JQuery'nin süresini uzattım $.parseJSON() sadece biraz, bu yüzden talimat verdiğinizde otomatik olarak ayrıştırmak mümkün. ASP.NET biçimlendirilmiş tarihleri ​​işler/Date(12348721342)/) ISO formatlı tarihlerin yanı sıra (2010-01-01T12.34.56.789Z) tarayıcılarda yerel JSON işlevleri tarafından desteklenen (ve json2.js gibi kitaplıklar).

Neyse. Tarih dönüşüm kodunuzu tekrar tekrar etmek istemezseniz, okumanızı öneririm bu blog yazısı ve hayatınızı biraz daha kolaylaştıracak kodu alın.


53





JavaScript’te diyorsan,

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

Doğru tarih olduğunu göreceksiniz ve JavaScript kodunda herhangi bir yerde herhangi bir çerçeve ile kullanabilirsiniz.


50



Ben de öyle olduğu düşüncesiyle düşünürdüm: var thedate = / Date (1224043200000) /; en azından benim için... - rball
Tarih () ve Tarih (1224043200000) ikisi de hem Chrome hem de Firefox'ta aynı sonucu verir. Bunun eski tarayıcılarda işe yarayıp yaramayacağından emin değilsiniz, ancak bu cevap artık tarayıcılarda çalışmıyor. - James
@James, Evet tarayıcı geçerli tarih veriyor. :( - vissu
"Yeni Tarih (1224043200000)" şeklinde yazmanız gerekiyor. - BrainSlugs83


Demoyu kontrol etmek için buraya tıklayın

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

Sonuç - "10/15/2008"


47



Yukarıdaki yöntem için sadece bir gelişme. işlev formatearFecha (fec) {var value = new Tarih (parseInt (fec.replace (/ (^. * () | ([+ -]. * $) / g, ''))) var mes = value.getMonth (); var dia = value.getDate (); var date = dia + "/" + mes + "/" + value.getFullYear (); if (dia <10) date = date.substr (0, 0) + '0' + dia + date.substr (1); if (mes <10) date = date.substr (0, 3) + '0' + mes + date.substr (4); dönüş tarihi;} tarih biçimi ddMMyyyy. - Matias
ohh !!! çok teşekkür ederim!!! ayımı gerçekten yaptı. - Raihan Ridoy