標籤:date日期初始化 js date date日期建立 new datedatestring date建立
哎。。這些個月人變懶了。。。以後多寫寫部落格才行
上周五測試報了個問題,說日期計算出現了問題。原兩日期相差1天的,但是系統計算出相差31天。(當天是2014年10月31日 周五)
後來查了下原因,一兄弟前台js代碼是這麼寫的
功能是想建立一個為‘2014-11-03 23:59:59‘的時間對象。
var expirationDateStr = '2014-11-03 23:59:59'; var expirationDate = new Date(); expirationDate.setFullYear(parseInt(expirationDateStr.substr(0, 4), 10)); expirationDate.setMonth(parseInt(expirationDateStr.substr(5, 2), 10) - 1); expirationDate.setDate(parseInt(expirationDateStr.substr(8, 2), 10)); expirationDate.setHours(parseInt(expirationDateStr.substr(11, 2), 10)); expirationDate.setMinutes(parseInt(expirationDateStr.substr(14, 2), 10)); expirationDate.setSeconds(parseInt(expirationDateStr.substr(17, 2), 10));
第二句:new一個Date對象,這個建立的是系統目前時間對象,假設當時時間為2014-10-31 17:30:00,
控制台列印expirationDate為:Fri Oct 31 23:59:59 UTC+0800 2014(2014-10-31 23:59:59) 。
後六句:設定時間,將expirationDateStr中的年月日時分秒替換到擷取的系統時間。(parseInt(?,10)作用是把?轉化為十進位int型整數,substr()字串截取方法)
我們可以再控制台中列印一下替換後的expirationDate,(console.info(expirationDate))
理想中應該為: Mon Nov 3 23:59:59 UTC+0800 2014(2014-11-03 23:59:59)
可是當時列印出來的卻是:Wed Dec 3 23:59:59 UTC+0800 2014(2014-12-03 23:59:59)
後來我特別鬱悶,查了js的api覺得沒問題啊setFullYear();setMonth();setDate();確實是這麼用來的啊。。想想是不是因為傳進去的參數不是int,後來發現也不是。
那為什麼會出現這種情況呢?
分析一下
當前日期“2014-10-31 17:30:00”
然後:setFullYear(2014)沒有問題,還是2014-10-31 17:30:00
setMonth(10) 出問題了,日期變為“2014-12-01 17:30:00”,這是因為setMonth(10)即改變日期為“2014-11-31 17:30:00”,但是這個日期是不存在的,Date會自動識別並進行轉化,11月只有30天,則月變為12,日則為1.。。最後setMonth(10)其實是將“2014-10-31 17:30:00”轉換成“2014-12-01 17:30:00”(setMonth()參數為0-11,10則為11月)
setDate(03) 因為設定月的時候日期已經變為“2014-12-01 17:30:00”,所以此時日期為:“2014-12-03 17:30:00”。
後面時分秒都沒有錯 即出現文章開始控制台列印轉換後日期Wed Dec 3 23:59:59 UTC+0800 2014(2014-12-03 23:59:59)
所以,要實現以上功能不能直接用setFullYear();setMonth();setDate();替換當前日期的年月日。(當然java中也是會出現這種問題)
那應該如何設定就涉及到Date()初始化的問題了。
js的API中對Date()的建立有如下四種:
var d = new Date();var d = new Date(milliseconds);var d = new Date(dateString);var d = new Date(year, month, day, hours, minutes, seconds, milliseconds);
話說API中好似沒那麼詳細。。。。
對於這四種方法我只說第三種new Date(dateString)
var str1 = "2014-11-06 15:30:00";var str2 = "06-11-2014 15:30:00";var str3 = "2014/11/06 15:30:00";var str4 = "06/11/2014 15:30:00";var str5 = "2014年11月06日 15:30:00";var str6 = "06日11月2014年 15:30:00";console.info("*******建立2014-11-06 15:30:00 日期對象測試*******");console.info(str1 + ":" + new Date(str1));console.info(str2 + ":" + new Date(str2));console.info(str3 + ":" + new Date(str3));console.info(str4 + ":" + new Date(str4));console.info(str5 + ":" + new Date(str5));console.info(str6 + ":" + new Date(str6));console.info("*****正確為:Thu Nov 6 15:30:00 UTC+0800 2014 *****");
控制台測試一下這段js結果如下:
*******建立2014-11-06 15:30:00 日期對象測試******* 2014-11-06 15:30:00:Invalid Date 06-11-2014 15:30:00:Wed Jun 11 15:30:00 UTC+0800 2014 2014/11/06 15:30:00:Thu Nov 6 15:30:00 UTC+0800 2014 06/11/2014 15:30:00:Wed Jun 11 15:30:00 UTC+0800 2014 2014年11月06日 15:30:00:Invalid Date 06日11月2014年 15:30:00:Invalid Date *****正確為:Thu Nov 6 15:30:00 UTC+0800 2014 *****
可以看出dateString 的格式為var str3 = "2014/11/06 15:30:00"; 即日期用斜杠“/”間隔 為 : yyyy/MM/dd hh:mm:ss
雖然我不知道還有沒有其他的格式,的那是我發現new Date("11-06-2014 15:30:00");也能建立一個日期為2014-11-06 15:30:00對象。
既然如此。如果要實現文章開始代碼的功能,我們可以用以下代碼實現:
var expirationDateStr = '2014-11-03 23:59:59'; var expirationDate = new Date(expirationDateStr.replace(/-/g, "/"));
兩句代碼就可以了。replace()自己查一下。replace(/-/g, "/")意思是替換字串中的“-”為“/”,替換後字串格式為2014/11/03 23:59:59,g全域替換的意思,不加g的話執行一次replace只替換一個“-”
Date()日期建立