JSON資料傳輸大法第一式——用OADate處理日期格式
JSON作為一種輕量級的資料交換格式,通常採用完全獨立於程式語言的文字格式來儲存和表示資料。它的層次結構簡潔清晰,易於人們的閱讀和編寫,此外機器編寫和生成也會變得容易,可以有效地提升網路傳輸效率,這些因素使得JSON成為理想的資料交換語言。
由於JSON的使用方式十分簡單,這個方便的傳輸形式很快就風靡Web世界,並且成為ECMA標準。幾乎所有程式語言都有解析JSON的庫,而在JavaScript中,我們可以直接使用JSON,因為JavaScript內建了JSON的解析。把JavaScript物件變成JSON,就是把這個物件序列化成一個JSON格式的字串,這樣才能夠通過網路傳遞給其他計算機。如果我們收到一個JSON格式的字串,只需要把它反序列化成一個JavaScript物件,就可以在JavaScript中直接使用這個物件了。
JSON的使用
JSON 最常見的用法之一,是從 web 伺服器上讀取 JSON 資料(作為檔案或作為 HttpRequest),將 JSON 資料轉換為 JavaScript 物件,然後在網頁中使用該資料。
建立包含 JSON 語法的 JavaScript 字串:
var txt = '{ "employees" : [' + '{ "firstName":"John" , "lastName":"Doe" },' + '{ "firstName":"Anna" , "lastName":"Smith" },' + '{ "firstName":"Peter" , "lastName":"Jones" } ]}';
由於 JSON 語法是 JavaScript 語法的子集,JavaScript 函式 eval() 可用於將 JSON 文字轉換為 JavaScript 物件。
eval() 函式使用的是 JavaScript 編譯器,可解析 JSON 文字,然後生成 JavaScript 物件。必須把文字包圍在括號中,這樣才能避免語法錯誤:
var obj = eval ("(" + txt + ")");
除此之外的常用方法還有:
1、map轉換成json
JSONObject json = new JSONObject(map);
2、String轉換成json
JSONObject.parseObject(StringText)
3、List轉換成json
JSONArray json = new JSONArray(list);
4、json轉換成List
list = JSONObject.parseArray(list,String.class)
但其實我們在進行資料傳輸的時候,除了我們常見的資料如陣列等格式之外,"時間"也是資料傳輸中的重要型別。
OADate的處理
有個玩笑說,企業資料化的盡頭的就是資料表格,資料表中重要的一項就是時間資料。
相信有用過日期格式並進行過json資料匯出的小夥伴應該不難發現,當單元格的值是一個日期時,我們匯出的日期資料會被儲存為OADate。
(圖片來自網路)
通常情況下我們使用OADate是為了解決日期序列化以及時區問題,所以我們使用這種特殊的方式儲存日期。但是很多情況下我們需要對日期資料進行一些處理,但是無奈的是不知如何進行轉換。
今天——它來了,它來了,葡萄帶著教程走來啦。
接下來我們來解決JSON日期格式資料處理問題,且針對不同程式設計環境都有解決方案。
首先我們來看前端。
function fromOADate(date) {
var oaDateReg = new RegExp('^/OADate\\(([-+]?(\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)\\)/\\s*
);
if (typeof date === "string" && oaDateReg.test(date)) {
var oadate = parseFloat(date.match(oaDateReg)[1]);
var ms = (oadate * 86400000 * 1440 - 25569 * 86400000 * 1440 + new Date((oadate - 25569) * 86400000).getTimezoneOffset() * 86400000 ) / 1440;
return new Date(ms);
}else{
return date;
}
}
除了上述介紹的內容外,還有一個取巧的辦法就是通過tag進行一個轉換:
sheet.tag("/OADate(44542)/");
var date = sheet.tag();
後端java環境下:
long d = 44542;
double mantissa = d - (long) d;
double hour = mantissa*24;
double min =(hour - (long)hour) * 60;
double sec=(min- (long)min) * 60;
SimpleDateFormat myFormat = new SimpleDateFormat("dd MM yyyy");
Date baseDate = myFormat.parse("30 12 1899");
Calendar c = Calendar.getInstance();
c.setTime(baseDate);
c.add(Calendar.DATE,(int)d);
c.add(Calendar.HOUR,(int)hour);
c.add(Calendar.MINUTE,(int)min);
c.add(Calendar.SECOND,(int)sec);
System.out.println(c.getTime());
最後的,.net環境只需一句程式碼就能搞定
System.DateTime.FromOADate(44542)
怎樣,學"廢"了嗎?
瞭解更多前端表格中的資料操作處理:https://demo.grapecity.com.cn/spreadjs/gc-sjs-samples/index.html?id=135