一:Date類型介紹
要創建一個日期對象,使用new操作符和Date構造函數即可:
var now = new Date();
Date.parse()方法
其中Date.parse()方法接收一個表示日期的字符串參數,然后嘗試根據這個字符串返回相應日期的毫秒數。ECMA-262沒有定義Date.parse()應該支持哪種日期格式,因此這個方法的行為因實現而異,而且通常是因地區而異。將地區設置為美國的瀏覽器通常都接受下列日期格式:
-
"月/日/年",如6/13/2004;
-
"英文月名 日,年",如May 12,2004;
-
"英文星期幾 英文月名 日 年 時:分:秒 時區",如Tue May 25 2004 00:00:00 GMT+0800。
-
ISO 8601擴展格式YYYY-MM-DDTHH:mm:ss:sssZ(例如 2004-05-25T00::00:00)。只有兼容ECMAScript5的實現支持這種格式。
例如,要為2004年5月25日創建一個日期對象,可以使用下面的代碼:
//Tue May 25 2004 00:00:00 GMT+0800 (中國標准時間) var someDate = new Date(Date.parse('May 25,2004'));
如果傳入Data.parse()的方法的字符串不能表示日期格式,會返回NAN。實際上,如果直接將表示日期的字符串傳遞給Date構造函數,也會在后台調用Date.parse()方法,例如下面的代碼跟前面的是等價的。
//Tue May 25 2004 00:00:00 GMT+0800 (中國標准時間) var someDate = new Date('May 25,2004');
這行代碼將會得到與前面一行相同的日期對象。
Date.UTC()方法Date.UTC()同樣返回日期的毫秒數。但它與Date.parse()在構建值時使用的是不同的信息。Date.UTC()的參數分別表示年份、基於0的月數(一月是0,二月是1,依次類推)、月中的哪一天(1到31)、小時數(0到23)、分鍾、秒、毫秒數。在這些參數中只有前兩個參數是必須的(年和月)。如果沒有提供月中的天數,則假設天數為1;如果省略其它參數,則統統假設為0,如下例子:
//GMT時間2000年1月1日午夜零時 var y2k = new Date(Date.UTC(2000,0)); console.log(y2k); //Sat Jan 01 2000 08:00:00 GMT+0800 (中國標准時間) //GMT時間2005年5月5日下午5:55:55 var allFives = new Date(Date.UTC(2005,4,5,17,55,55)); console.log(allFives);//Fri May 06 2005 01:55:55 GMT+0800 (中國標准時間)
說明下:Greenwich Mean Time (GMT)格林尼治標准時間英國、愛爾蘭、冰島和葡萄牙屬於該時區。這個時區與中國北京時間的時差是8個小時,也就是說比北京時間晚8個小時。
Date構造函數Date構造函數會模仿Date.UTC(),但有一點不同的是,日期和時間都是基於本地時區而非GMT來創建。不過他們的參數跟Date.UTC()的參數一樣。
例如:
//本地時間2000年1月1日午夜零時 var y2k = new Date(2000,0); console.log(y2k); //Sat Jan 01 2000 00:00:00 GMT+0800 (中國標准時間) //本地時間2005年5月5日下午5:55:55 var allFives = new Date(2005,4,5,17,55,55); console.log(allFives);//Thu May 05 2005 17:55:55 GMT+0800 (中國標准時間)
給Date構造函數傳遞參數常使用如下幾種方式:(注:參數可以為整數; 也可以為字符串; 但格式必須正確)
-
new Date(2009,1,1); //正確
-
new Date("2009/1/1"); //正確
-
new Date("2009-1-1"); //不兼容,在谷歌下能解析,在IE瀏覽器9及以上結果為[date] Invalid Date,IE8及以下結果為NAN。
說明:日期對象new Date()的參數形式如下:
1)new Date("month dd,yyyy hh:mm:ss");
2)new Date("month dd,yyyy");
3)new Date(yyyy,mth,dd,hh,mm,ss);
4)new Date(yyyy,mth,dd);
5)new Date(ms);
需要注意最后一種形式,參數表示的是需要創建的時間和 GMT時間1970年1月1日之間相差的毫秒數。各種函數的含義如下:
month:用英文 表示月份名稱,從January到December
mth:用整數表示月份,從0(1月)到11(12月)
dd:表示一個 月中的第幾天,從1到31
yyyy:四位數表示的年份
hh:小時數,從0(午夜)到23(晚11點)
mm: 分鍾數,從0到59的整數
ss:秒數,從0到59的整數
ms:毫秒數,為大於等於0的整數
例如:
new Date("January 12,2006 22:19:35"); new Date("January 12,2006"); new Date(2006,0,12,22,19,35); new Date(2006,0,12); new Date(1137075575000);
上面的各種創建形式都表示2006年1月12日這一天。
Date.now()方法
ES5添加了Date.now()方法,返回表示這個方法時的日期和時間的毫秒數。這個方法簡化了使用Date對象分析代碼的工作,例如:
//取得開始時間 var start = Date.now(); //調用函數 dosomething(); //取得結束時間 var stop = Date.now(), result = stop - start; console.log(start,stop,result); //1494292306763 1494292306768 5 function dosomething(){ console.log('打印結果'); }
支持Date.now()方法的瀏覽器包括IE9+,FireFox3+,Safari3+,Opera10.5+和Chrome。在不支持的其它瀏覽器,使用+操作符把Date對象轉成字符串,也可以達到相同的目的。
//取得開始時間 var start = +new Date(); //調用函數 dosomething(); //取得結束時間 var stop = +new Date(), result = stop - start; console.log(start,stop,result); //1494292306763 1494292306768 5 function dosomething(){ console.log('打印結果'); }
那么就出來這么一個例子,JavaScript 獲取當前毫秒時間戳有以下幾種方法:
console.log(Date.parse(new Date())); //結果:1494301186000//不推薦; 毫秒改成了000顯示 console.log((new Date()).valueOf()); //結果:1494301186175 console.log(new Date().getTime()); //結果:1494301186175 console.log(Date.now()); //結果:1494301186175 console.log(+new Date()); //結果:1494301186175
繼承的方法
與其它引用類型一樣,Date類型也重寫了toLocaleString()、toString()和valueOf()方法。
其中toLocaleString()、toString()在顯示日期和時間沒有什么價值;而valueOf()方法不是返回的字符串,而是返回日期的毫秒表示。因此可以方便使用比較操作符(大於或小於)來比較日期值。如下面的例子:
var date1 = new Date(2007,0,1); var date2 = new Date(2007,1,1); console.log(date1 < date2); //true console.log(date1 > date2); //false
日期格式化方法
Date類型還有一些專門用於將日期格式化為字符串的方法,如下:
toDateString()——以特定於實現的格式顯示星期幾、月、日和年;
toTimeString()——以特定於實現的格式顯示時、分、秒和時區;
toLocaleDateString()——以特定與地區的格式顯示星期幾、月、日和年;
toLocaleTimeString()——以特定於實現的格式顯示時、分、秒;
toUTCString()——以特定於實現的格式完整的UTC日期。
與toLocaleString()和toString()方法一樣,以上這些字符串格式的方法輸出也是因瀏覽器而異的。因此沒有哪一個方法能夠用來在用戶界面上顯示一致的日期信息。
日期/時間組件方法
以下紅色標記為常用:
Date() 返回當日的日期和時間。getDate() 從 Date 對象返回一個月中的某一天 (1 ~ 31)。getDay() 從 Date 對象返回一周中的某一天 (0 ~ 6)。getMonth() 從 Date 對象返回月份 (0 ~ 11)。getFullYear() 從 Date 對象以四位數字返回年份。
getYear() 請使用 getFullYear() 方法代替。getHours() 返回 Date 對象的小時 (0 ~ 23)。getMinutes() 返回 Date 對象的分鍾 (0 ~ 59)。getSeconds() 返回 Date 對象的秒數 (0 ~ 59)。getMilliseconds() 返回 Date 對象的毫秒(0 ~ 999)。getTime() 返回 1970 年 1 月 1 日至今的毫秒數。
getTimezoneOffset() 返回本地時間與格林威治標准時間 (GMT) 的分鍾差。
getUTCDate() 根據世界時從 Date 對象返回月中的一天 (1 ~ 31)。
getUTCDay() 根據世界時從 Date 對象返回周中的一天 (0 ~ 6)。
getUTCMonth() 根據世界時從 Date 對象返回月份 (0 ~ 11)。
getUTCFullYear() 根據世界時從 Date 對象返回四位數的年份。
getUTCHours() 根據世界時返回 Date 對象的小時 (0 ~ 23)。
getUTCMinutes() 根據世界時返回 Date 對象的分鍾 (0 ~ 59)。
getUTCSeconds() 根據世界時返回 Date 對象的秒鍾 (0 ~ 59)。
getUTCMilliseconds() 根據世界時返回 Date 對象的毫秒(0 ~ 999)。setDate() 設置 Date 對象中月的某一天 (1 ~ 31)。setMonth() 設置 Date 對象中月份 (0 ~ 11)。setFullYear() 設置 Date 對象中的年份(四位數字)。
setYear() 請使用 setFullYear() 方法代替。setHours() 設置 Date 對象中的小時 (0 ~ 23)。setMinutes() 設置 Date 對象中的分鍾 (0 ~ 59)。setSeconds() 設置 Date 對象中的秒鍾 (0 ~ 59)。setMilliseconds() 設置 Date 對象中的毫秒 (0 ~ 999)。setTime() 以毫秒設置 Date 對象。
setUTCDate() 根據世界時設置 Date 對象中月份的一天 (1 ~ 31)。
setUTCMonth() 根據世界時設置 Date 對象中的月份 (0 ~ 11)。
setUTCFullYear() 根據世界時設置 Date 對象中的年份(四位數字)。
setUTCHours() 根據世界時設置 Date 對象中的小時 (0 ~ 23)。
setUTCMinutes() 根據世界時設置 Date 對象中的分鍾 (0 ~ 59)。
setUTCSeconds() 根據世界時設置 Date 對象中的秒鍾 (0 ~ 59)。
setUTCMilliseconds() 根據世界時設置 Date 對象中的毫秒 (0 ~ 999)。
調用方式:
var myDate = new Date(); myDate.getYear(); //獲取當前年份(2位) myDate.getFullYear(); //獲取完整的年份(4位,1970-????) myDate.getMonth(); //獲取當前月份(0-11,0代表1月) // 所以獲取當前月份是myDate.getMonth()+1; myDate.getDate(); //獲取當前日(1-31) myDate.getDay(); //獲取當前星期X(0-6,0代表星期天) myDate.getTime(); //獲取當前時間(從1970.1.1開始的毫秒數) myDate.getHours(); //獲取當前小時數(0-23) myDate.getMinutes(); //獲取當前分鍾數(0-59) myDate.getSeconds(); //獲取當前秒數(0-59) myDate.getMilliseconds(); //獲取當前毫秒數(0-999)
簡單常用示例
1.獲取當前時間
function getNowTime() { return new Date(); }
2.時間與天數相加
function getTimeAddDays(time, days) { return new Date(time.getTime() + days * 24 * 60 * 60 * 1000); }
3.獲取並格式化日期:年-月-日
function getFormatDate(time) { return time.getFullYear() + "-" + (time.getMonth() + 1) + "-" + time.getDate(); }
4.字符串轉換為日期,字符串格式:2011-11-20
function convertToDate(strings) { return new Date(Date.parse(strings.replace(/-/g, "/"))); }
或者
function convertToDate(strings) { return new Date(strings.replace(/-/g, "/")); }
5.獲取並格式化星期
// 計算系統當前是星期幾 var str = "今天是星期" + "日一二三四五六".charat(new Date().getDay());
6.時間比較
function compareTime(time1, time2) { return time1.getTime() - time2.getTime(); }
7.計算兩個日期之間相隔的天數
function getDays(time1, tiem2){ var day = 24*60*60*1000; return (time1.getTime() - time2.getTime())/day; }
擴展示例
1.JS判斷某年某月有多少天
JavaScript里面的new Date("xxxx/xx/xx")這個日期的構造方法有一個妙處,當你傳入的是"xxxx/xx/0"(0號)的話,得到的日期是"xx"月的前一個月的最后一天("xx"月的最大取值是69,題外話),如果傳入"1999/13/0",會得到"1998/12/31"。而且最大的好處是當你傳 入"xxxx/3/0",會得到xxxx年2月的最后一天,它會自動判斷當年是否是閏年來返回28或29,不用自己判斷,太方便了!!所以,我們想得到選 擇年選擇月有多少天的話,只需要
var d=new Date("選擇年/選擇月+1/0");alert(d.getDate());
下面是使用Javascript編寫的獲取某年某月有多少天的getDaysInOneMonth(year, month)方法:
function getDaysInOneMonth(year, month){ month = parseInt(month,10)+1; var d= new Date(year+"/"+month+"/0"); return d.getDate(); }
Chrome瀏覽器(谷歌瀏覽器)對這個特性不支持,得到的結果是NAN。兼容性問題啊!其原因就是非標准日期格式。
改成如下的格式就OK:
function getDaysInMonth(year,month){ var month = parseInt(month,10); var temp = new Date(year,month,0); return temp.getDate(); } console.log(getDaysInMonth(2017,2)); //28
2.js獲取某年某月的哪些天是周六和周日
<div id="text"></div>
<script type="text/javascript">
function time(y,m){
var tempTime = new Date(y,m,0);
var time = new Date();
var saturday = new Array();
var sunday = new Array();
for(var i=1;i<=tempTime.getDate();i++){
var ss = time.setFullYear(y,m-1,i);
var day = time.getDay();
if(day == 6){
saturday.push(i);
}else if(day == 0){
sunday.push(i);
}
}
var text = y+"年"+m+"月份"+"<br />"
+"周六:"+saturday.toString()+"<br />"
+"周日:"+sunday.toString();
document.getElementById("text").innerHTML = text;
}
time(2017,2);
</script>
3.使用JavaScript生成一個倒數7天的數組
描述:
比如今天是10月1號,生成的數組是["9月25號","9月26號","9月27號","9月28號","9月29號","9月30號","10月1號"]。這個難點就是需要判斷這個月份(可能還需要上一個月份)是30天還是31天,而且還有瑞年的2月28天或者29天。
方法一:
不需要那么復雜,在js中非常簡單,因為js的date對象是可以參與數學運算的!!!看下面的代碼:
var now = new Date('2012/3/2 12:00:00'); var s = ''; var i = 0; while (i < 7) { s += now.getFullYear() + '/' + (now.getMonth() + 1) + '/' + now.getDate() + '\n'; // 這個是關鍵!!!減去一天的毫秒數效果就是把日期往前推一天 now = new Date(now - 24 * 60 * 60 * 1000); i++; } console.log(s);
結果:
2012/3/2 2012/3/1 2012/2/29 2012/2/28 2012/2/27 2012/2/26 2012/2/25
方法二:
根據當前系統時間,來計算這個倒數7天的數組:
var now = new Date(); var s = ''; var i = 0; while (i < 7) { s += now.getFullYear() + '/' + (now.getMonth() + 1) + '/' + now.getDate() + '\n'; // 這個是關鍵!!!減去一天的毫秒數效果就是把日期往前推一天 now = new Date(now - 24 * 60 * 60 * 1000); i++; } console.log(s);
結果:
2017/6/2 2017/6/1 2017/5/31 2017/5/30 2017/5/29 2017/5/28 2017/5/27
方法三:
用Date 的 setDate()方法
var today = new Date(); var curday = today.getFullYear() +"/" + Number(today.getMonth() + 1) +"/"+ today.getDate(); //2017/11/9 var dates = [curday]; for (var i = 1; i < 7; i++) { var d = new Date(today); d.setDate(d.getDate() - i); var ss = d.getFullYear() +"/" + Number(d.getMonth() + 1) +"/"+ d.getDate(); dates.unshift(ss); } console.log(dates);
結果:
["2017/11/3", "2017/11/4", "2017/11/5", "2017/11/6", "2017/11/7", "2017/11/8", "2017/11/9"]
注:setDate() 方法用於設置一個月的某一天。
getDate() 方法可返回月份的某一天。
unshift() 方法可向數組的開頭添加一個或更多元素,並返回新的長度。
4.js獲取上一個月、下一個月格式為yyyy-mm-dd的日期
function GetMonthFun(){} //date的日期格式為 yyyyy-mm-dd GetMonthFun.prototype.getPrevMonth = function(date){ var arr = date.split('-'); var year = arr[0]; //獲取當前日期的年份 var month = arr[1]; //獲取當前日期的月份 var day = arr[2]; //獲取當前日期的日 var days = new Date(year, month, 0); days = days.getDate(); //獲取當前日期中月的天數 var year2 = year; var month2 = parseInt(month) - 1; if (month2 == 0) { year2 = parseInt(year2) - 1; month2 = 12; } var day2 = day; var days2 = new Date(year2, month2, 0); days2 = days2.getDate(); if (day2 > days2) { day2 = days2; } if (month2 < 10) { month2 = '0' + month2; } var t2 = year2 + '-' + month2 + '-' + day2; return t2; } //date的日期格式為 yyyyy-mm-dd GetMonthFun.prototype.getNextMonth = function(date){ var arr = date.split('-'); var year = arr[0]; //獲取當前日期的年份 var month = arr[1]; //獲取當前日期的月份 var day = arr[2]; //獲取當前日期的日 var days = new Date(year, month, 0); days = days.getDate(); //獲取當前日期中的月的天數 var year2 = year; var month2 = parseInt(month) + 1; if (month2 == 13) { year2 = parseInt(year2) + 1; month2 = 1; } var day2 = day; var days2 = new Date(year2, month2, 0); days2 = days2.getDate(); if (day2 > days2) { day2 = days2; } if (month2 < 10) { month2 = '0' + month2; } var t2 = year2 + '-' + month2 + '-' + day2; return t2; } var dateObj = new GetMonthFun(); console.log(dateObj.getPrevMonth('2014-01-25')); //2013-12-25 console.log(dateObj.getNextMonth('2014-10-31')); //2014-11-30
5.判斷一組日期是否是連續的
參考文章地址:http://www.cnblogs.com/52cik/p/consecutive-dates.html
如題所示,給定相同格式的5個日期,怎樣判斷是否是連續的5天?
let days = [ '2016-02-28', '2016-02-29', // 閏月 '2016-03-01', // 跨月 '2016-03-02', '2016-03-03', ] // 先排序,然后轉時間戳 let _days = days.sort().map((d, i) => { let dt = new Date(d) dt.setDate(dt.getDate() + 4 - i) // 處理為相同日期 return +dt }) // 比較時間戳是否一致 console.log( _days[0] == _days[1] && _days[0] == _days[2] && _days[0] == _days[3] && _days[0] == _days[4] )
上述代碼還是有點缺陷的,因為時分秒沒有處理,如果有時分秒,也要先抹去。
let days = [ '2016-02-28 12:00:00', '2016-02-29 12:00:01', // 閏月 '2016-03-01 12:00:02', // 跨月 '2016-03-02 12:00:03', '2016-03-03 12:00:04', '2016-03-04 12:00:04', ] console.log(continueDays(days)) function continueDays(arr_days) { // 先排序,然后轉時間戳 let days = arr_days.sort().map((d, i) => { let dt = new Date(d) dt.setDate(dt.getDate() + 4 - i) // 處理為相同日期 // 抹去 時 分 秒 毫秒 dt.setHours(0) dt.setMinutes(0) dt.setSeconds(0) dt.setMilliseconds(0) return +dt }) let ret = true days.forEach(d => { if (days[0] !== d) { ret = false } }) return ret }
這個函數只是改動了2個地方,抹去 時 分 秒 毫秒 和 循環比較,其他都一樣。
6.Date format(日期格式化)
方法一:
// 對Date的擴展,將 Date 轉化為指定格式的String // 月(M)、日(d)、小時(h)、分(m)、秒(s)、季度(q) 可以用 1-2 個占位符, // 年(y)可以用 1-4 個占位符,毫秒(S)只能用 1 個占位符(是 1-3 位的數字) // 例子: // (new Date()).Format("yyyy-MM-dd hh:mm:ss.S") ==> 2006-07-02 08:09:04.423 // (new Date()).Format("yyyy-M-d h:m:s.S") ==> 2006-7-2 8:9:4.18 Date.prototype.Format = function (fmt) { var o = { "M+": this.getMonth() + 1, //月份 "d+": this.getDate(), //日 "H+": this.getHours(), //小時 "m+": this.getMinutes(), //分 "s+": this.getSeconds(), //秒 "q+": Math.floor((this.getMonth() + 3) / 3), //季度 "S": this.getMilliseconds() //毫秒 }; if (/(y+)/.test(fmt)){ fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length)); } for (var k in o){ if (new RegExp("(" + k + ")").test(fmt)){ fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length))); } } return fmt; }
調用方式:
var time1 = new Date().Format("yyyy-MM-dd"); var time2 = new Date().Format("yyyy-MM-dd HH:mm:ss");
方法二:
/** * 對Date的擴展,將 Date 轉化為指定格式的String * 月(M)、日(d)、12小時(h)、24小時(H)、分(m)、秒(s)、周(E)、季度(q) 可以用 1-2 個占位符 * 年(y)可以用 1-4 個占位符,毫秒(S)只能用 1 個占位符(是 1-3 位的數字) * eg: * (new Date()).pattern("yyyy-MM-dd hh:mm:ss.S")==> 2006-07-02 08:09:04.423 * (new Date()).pattern("yyyy-MM-dd E HH:mm:ss") ==> 2009-03-10 二 20:09:04 * (new Date()).pattern("yyyy-MM-dd EE hh:mm:ss") ==> 2009-03-10 周二 08:09:04 * (new Date()).pattern("yyyy-MM-dd EEE hh:mm:ss") ==> 2009-03-10 星期二 08:09:04 * (new Date()).pattern("yyyy-M-d h:m:s.S") ==> 2006-7-2 8:9:4.18 */ Date.prototype.pattern=function(fmt) { var o = { "M+" : this.getMonth()+1, //月份 "d+" : this.getDate(), //日 "h+" : this.getHours()%12 == 0 ? 12 : this.getHours()%12, //小時 "H+" : this.getHours(), //小時 "m+" : this.getMinutes(), //分 "s+" : this.getSeconds(), //秒 "q+" : Math.floor((this.getMonth()+3)/3), //季度 "S" : this.getMilliseconds() //毫秒 }; if(/(y+)/.test(fmt)){ fmt=fmt.replace(RegExp.$1, (this.getFullYear()+"").substr(4 - RegExp.$1.length)); } if(/(E+)/.test(fmt)){ fmt=fmt.replace(RegExp.$1, ((RegExp.$1.length>1) ? (RegExp.$1.length>2 ? "星期" : "周") : "") + "日一二三四五六".charAt(this.getDay())); } for(var k in o){ if(new RegExp("("+ k +")").test(fmt)){ fmt = fmt.replace(RegExp.$1, (RegExp.$1.length==1) ? (o[k]) : (("00"+ o[k]).substr((""+ o[k]).length))); } } return fmt; }
調用方式:
var date = new Date(); console.log(date.pattern("yyyy-MM-dd EEE hh:mm:ss")); //2017-06-09 星期五 10:16:12 console.log(date.pattern("yyyy-MM-dd EE hh:mm:ss")); //2017-06-09 周五 10:16:12 console.log(date.pattern("yyyy-MM-dd E hh:mm:ss")); //2017-06-09 五 10:16:12
