js Date對象總結


  Date在js中和Array類似,都是擁有自己的特殊方法的特殊對象。

  由於平常用到Date着實不多,對它的了解頗淺。上周被問到怎么樣獲取某年某個月的天數,我當時想了一會兒,回答說有兩種,一種自己寫判斷閏年的邏輯,每個月天數分兩種情況存數組,一種是利用js Date對象的特性(其實是他總結的...)。不過具體用到什么特性我答不上來。現在既然想起來了,也學習總結一下好了。

  1.Date get和set系列

  (注:getTime()具體的參照時間為1970年1月1日8點0分0秒)

  所有的set對應都有get系列,詳情參照 http://www.w3school.com.cn/jsref/jsref_obj_date.asp。

  值得注意的是所有的get和set都必須初始化一個實例並以實例的屬性方式調用。如:

 

  其實也很容易理解,畢竟要設置或者返回Date對象的值,肯定這個值得先存在啊。標准點的寫法是var date=new Date(2015,7,30);date.getDate()

  如果new Date()里面沒有傳任何參數,也沒有用任何set系列方法,那么就指的是當前的值(本地計算時鍾),包括時分秒。js中可以很容易用這個特征來以任何形式顯示當前時間。

var date = new Date(),
    nowYear = date.getFullYear(),
    nowMonth = date.getMonth() + 1,  //注意getMonth從0開始,getDay()也是(此時0代表星期日)
    nowDay = date.getDate(),
    nowHour = date.getHours(),
    nowMinute = date.getMinutes(),
    nowSecond = date.getSeconds(),
    weekday = ["星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"],
    nowWeek = weekday[date.getDay()];
console.log(nowYear + '年' + nowMonth + '月' + nowDay + '日' + nowHour + '時' + nowMinute + '分' + nowSecond + '秒' + nowWeek);

  同樣,利用內置的 setInterval 或者 setTimeout 回調自身的方法,可以很容易的做時鍾效果。見w3cSchool http://www.w3school.com.cn/tiy/t.asp?f=jsrf_date_timing_clock。

  2.其它方法

  首先是每個對象都有的valueOf()(得到真實值)和toString()(得到字符串形式表示值)。注意紅色框內的不同。

  

  然后是

    toTimeString() :將Date對象時間部分轉化為字符串並返回,因此必須有時間參數,必須有實例,

    toDateString() :將Date對象的日期部分轉化為字符串並返回,必須有實例。

 

  最后是

    parse() : 返回1970年1月1日8點整到指定日期(字符串)的毫秒數,精確到秒。只能用Date.parse(Date實例)的形式調用。 (注意比較getTime(),精確到毫秒。)

    toSource() : 返回源代碼。

  注:toLocaleString:根據本地時間格式,將Date對象轉化為字符串,與UTC,GMT對應,在Array和在Date中這個方法都已經過時,就不再糾結。UTC系列用得很少,也就是格式有所不同,詳情參見http://www.w3school.com.cn/jsref/jsref_obj_date.asp。

  3.重要知識點小結

  (1)set系列的參數討論

    setFullYear()前三個參數有用,時分秒還是本地的~~~

 

    其它set系列都只有第一個參數有用,返回值分別為在new Date()(當前時間)的基礎上加上了Month/Date/Minutes * 對應的第一個參數。

 

  (2)設置完整時間

  

  很明顯setTime也是set系列,故而只是在原來的基礎上增加了1992毫秒(顯示為1s)。由於setTime比較特殊,是以1970年1月1日早上8點( FF、Chrome、IE5+、Opera (safari用得少就沒測) 中測試,雖然w3School中說是0點,但是測試一下new Date(1970,0,1,8,0,0).getTime()顯示為0就很明顯了 )為基准開始算的,因此在實際執行前其實date實例已經不是new Date()所對應的當前時間了,而是有一個被轉化為基准時間的過程。所以顯示的為1970,0,1,8,0,1。如果將1992改為5000則為1970,0,1,8,0,5。

  而設置完整時間的方法,為new Date對象的時候傳入需要設置的時間的參數。可以為1992,10,3,10,2,50 (還可以加上毫秒級,然后用getTime()檢測出來,但是一般用不上) 的數字形式 (表示1992年11月3日10時2分50秒),也可以為標准字符串格式(但一般不會這么寫吧~~~)。

 

  (3)getDate()

  一般放在后面就是用來壓軸用的,嘿嘿。

  作為get系列,除了參數的個數有些講究之外,參數的取值也是很有講究的。首先回答最初的問題,得到某年某個月的最大天數(可以理解為判斷閏年~)。

new Date(2014,2,0).getDate();     //返回2014年2月份的最后一天(28)

  當第三個參數為0的時候,其實是返回上一個月的最后一天 (注意月份的數字2實際上是三月份,故而代碼是返回2月份的最后一天在當月中的序號)。看更多例子

new Date(2014,1,30).getDate();     //返回2014年3月2日在3月份中的天數(2)
new Date(2014,2,-1).getDate();     //返回2014年2月份的倒數第二天(27)

//當參數缺少的時候顯示1
new Date(2014,8).getDate(); 
new Date(14,18).getDate(); 
new Date(180).getDate();

//當參數多余的時候多余的不起作用(並沒有設置對arguments[3+]的操作)
new Date(2015,2,0,2).getDate();  

  天數多了會自動往下月計算,天數為負數則往上個月計算。參數少了有問題,多了的話多的部分沒作用。對比其它的set系列其實也差不多就是這么個實現的思路,看(2)就知道了。

 

  (4)兼容性  

      類似 new Date('xxxx/xx/xx xx:xx:xx') 形式的時間對象在 IOS 和 Andriod 系統上都可以被正確的識別,而類似 new Date('xxxx-xx-xx xx:xx:xx') 形式的時間對象在 ios 系統上無法被正確的識別,需要做一層轉化。

function parseDate(dateStr) {
  if (!dateStr) {
    return new Date();
  }

  if (dateStr.indexOf('/') > -1) {
    return new Date(dateStr);
  } else {
    return new Date(dateStr.replace(/-/g, '/'));
  }
}

  

  我明明記得還有個什么挺重要的部分沒寫,但就是忘了~~~待我想起來再添加上去。如果本文中有什么紕漏或者不正確的地方,歡迎指正,謝謝!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM