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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章