1. 程式人生 > 其它 >JSON資料傳輸大法第一式——用OADate處理日期格式

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