JSON Date Format

來源:互聯網
上載者:User

JSON

是一種流行地、廣泛地應用於Internet的資料格式,相對於XML而言,它更小、解析更快。但可能就是由於“小”,JSON規範並沒有定義如何序列化日期。儘管在社區已經有了很多這方面的討論,但規範仍然未形成。爭論的焦點在於日期序列化是否應直接採用數字或者ISO字串日期,還是應該採用特殊分隔字元標記的字串日期。因為如果沒有分隔字元,就沒法自我描述自身是一個日期類型。先擱置爭議,就各AJAX庫和JSON庫封裝的日期格式作統一討論。

(1)直接數字型日期。

因為 JavaScript

的時間類型是從1970年1月1日以來的毫秒數。這有點類似UNIX/Linux的時間是1970年1月1日以來的秒數。當然,為支援國際化,這裡的1970年1月1日的毫秒數是UTC(GMT)格林威治時間。

如:

{Date: new Date(1278903921551)}

JavaScript Parser:

var obj = eval('(' + "{Date: new Date(1278903921551)}" + ')');<br />var dateValue = obj["Date"];

C# Parser:

long dateNumber = 1278903921551;<br />long beginTicks = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc).Ticks;<br />DateTime dateValue = new DateTime(beginTicks + dateNumber * 10000);

(2)直接字串日期。

字串日期,常見的是ISO8601

標準。

如:

{Date:"2010-07-12T03:05:21Z"}

JavaScript Parser:

// Parse JSON string value when the string value is ISO Date Format<br />var obj = eval('(' + '{Date:"2010-07-12T03:05:21Z"}' + ')');<br />scanDate(obj, isoDateParser);<br />var dateValue = obj["Date"];<br />function scanDate(obj, dateParser) {<br />for (var key in obj) {<br />obj[key] = dateParser(key, obj[key]);<br />if (typeof (obj[key]) === 'object') {<br />scanDate(obj[key], dateParser);<br />}<br />}<br />}<br />function isoDateParser(key, value) {<br />if (typeof value === 'string') {<br />var a = /^(/d{4})-(/d{2})-(/d{2})T(/d{2}):(/d{2}):(/d{2}(?:/./d*)?)(?:([/+-])(/d{2})/:(/d{2}))?Z?$/.exec(value);<br />if (a) {<br />Var utcMilliseconds = Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4], +a[5], +a[6]);<br />return new Date(utcMilliseconds);<br />}<br />}<br />return value;<br />}

C# Parser:

string dateString = "2010-07-12T03:05:21Z"

DateTime dateValue = DateTime.Parse(dateString);

(3)帶分隔字元的數字日期。

/Date(NUMBER(+/-)TZD)/"//Date(NUMBER(+/-)TZD)//"

NUMBER是1970年1月1日以來的毫秒數,TZD是4位元時區的。+和-表示東、西時區。如果沒有時區,則NUMBER是UTC時間。用/Date()/分隔。//和//是對/的轉義。JSON.NET和Microsoft AJAX Library用的就是這種格式。中間的數字也是格林威治時間1970年1月1日以來的毫秒數。和第一種不同是沒有採用JavaScript的日期構造器,而是採用了一種自訂的分隔字元。

如:"//Date(1278903921551)//"。

JavaScript Parser:

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

C# Parser:

string dateString = "///Date(1278903921551)///";<br />int startPos = dateString.IndexOf("(")+1;<br />int endPos = dateString.LastIndexOf(")")-1;<br />long dateNumber = long.Parse(dateString.Substring(startPos, endPos - startPos + 1));<br />long beginTicks = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc).Ticks;<br />DateTime dateValue = new DateTime(beginTicks + dateNumber * 10000);

如:"//Date(1278903921551+0800)//"。

JavaScript Parser:

// Parse JSON string value when the string value is JSON Date Format<br />var obj = eval('(' + '{Date://Date(1278903921551+0800)//}' + ')');<br />scanDate(obj, jsonDateParser);<br />var dateValue = obj["Date"];<br />function scanDate(obj, dateParser) {<br />for (var key in obj) {<br />obj[key] = dateParser(key, obj[key]);<br />if (typeof (obj[key]) === 'object ') {<br />scanDate(obj[key], dateParser);<br />}<br />}<br />}<br />function jsonDateParser(key, value) {<br /> if (typeof value === 'string' ) {<br /> var a = (/^///Date/((/d+)([/+/-](/d/d)(/d/d))?/)///gi).exec(value);<br />if (a) {<br />var utcMilliseconds = parseInt(a[1], 10) + ((a[3] == '-') ? -1 : 1) * (parseInt(a[4], 10) + (parseInt(a[5], 10) / 60.0)) * 60 * 60 * 1000;<br />return new Date(utcMilliseconds);<br /> }<br /> }<br />return value;<br />}

C# Parser:

string dateString = "///Date(1278903921551+0800)///";<br />int startPos = dateString.IndexOf("(") + 1;<br />int endPos = dateString.LastIndexOf(")") - 1;<br />string dateNumberString = dateString.Substring(startPos, endPos - startPos + 1);<br />int timeZoneMilSeconds = 0;<br />int? timeZoneIndex = null;<br />if (dateNumberString.IndexOf("+") > -1) {<br /> timeZoneIndex = dateNumberString.IndexOf("+");<br /> timeZoneMilSeconds = 1;<br />}<br />if (dateNumberString.IndexOf("-") > -1) {<br /> timeZoneIndex = dateNumberString.IndexOf("-");<br /> timeZoneMilSeconds = -1;<br />}<br />long dateNumber = 0;<br />if (timeZoneIndex.HasValue) {<br /> timeZoneMilSeconds = timeZoneMilSeconds * (int)((int.Parse(dateNumberString.Substring(timeZoneIndex.Value + 1).Substring(0, 2))<br /> + int.Parse(dateNumberString.Substring(timeZoneIndex.Value + 1).Substring(2)) / 60.0) * 60 * 60 * 1000);<br /> dateNumber = long.Parse(dateNumberString.Substring(0, timeZoneIndex.Value)) + timeZoneMilSeconds;<br />} else {<br /> dateNumber = long.Parse(dateNumberString);<br />}<br />long beginTicks = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc).Ticks;<br />DateTime dateValue = new DateTime(beginTicks + dateNumber * 10000);

以上就是常見的JSON的日期格式了。JSON庫或者一些AJAX庫已經封裝了相應的JavaScript的日期的支援,在解析時應直接使用JSON庫內建的解析器。如果需要自訂解析這些日期,可參考上述JavaScript和C#代碼。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.