JS日期計算

一、工具函數(shù)

// 補0函數(shù),1補成01
function padding(num) {
    return num < 10 ? '0' + num : num
}
// 將日期格式化為2019/03/19
function formalDate(year, month, day) {
    return [year, padding(month), padding(day)].join('-')
}
// 日期格式化
function formalDate1(t) {
    var d = new Date(t);
    return [d.getFullYear(), padding(d.getMonth() + 1), padding(d.getDate())].join('-');
}

二堪澎、日期計算

1)根據(jù)給定年份計算周時間段列表:
function countWeekList(year) {
     var firstDay = new Date(year, 0, 1) // 獲取給定年份第一天的日期
     while (firstDay.getDay() != 1) { // 獲取給定年份第一個完整周的周一日期
        firstDay.setDate(firstDay.getDate() + 1)
     }
     // 獲取給定年份下一年的第一天的日期曹阔,用來計算給定年份最后一天的日期,省去計算平閏年的步驟
     var lastDay = new Date(year + 1, 0, 1)
     var i = 1  // 控制輸出
     var toDate, fromDate
     for (var from = firstDay; from < lastDay;) { 
         // 記錄第i個周一的日期
         fromDate = formalDate(year, from.getMonth() + 1, from.getDate())
         from.setDate(from.getDate() + 6) // +6獲取第i個周天的日期
         if (from < lastDay) { // 日期未超過下一年的第一天時
              toDate = formalDate(year, from.getMonth() + 1, from.getDate())
              from.setDate(from.getDate() + 1)
         } else { // 日期超過下一年的第一天時
              lastDay.setDate(lastDay.getDate() - 1) // 只截取當前年份的日期操漠,超出的部分不要
              toDate = formalDate(year, lastDay.getMonth() + 1, lastDay.getDate())
         }
         // 打印結果
         if (fromDate < toDate) document.write(year + '年第' + i + '周:' + fromDate + '至' + toDate + '<br / >')
            i++
     }
}
console.log(countWeekList(2018))
2)根據(jù)給定年份計算月時間段列表:
function countMonthList(year) {
     var monthList = {} // 保存月份時間段列表
     var beginDate = new Date(year, 0, 1) // 保存當前年份第一天的日期
     var endDate = new Date(year + 1, 0, 1) // 保存當前年份下一年第一天的日期
     // 根據(jù)endDate獲取一個完整月的時間段
     function getLast(et) {
         // 減去一天即為上月最后一天业汰;
         et = et - 1000 * 60 * 60 * 24
         // 計算上月第一天的日期
         var t = new Date(et)
         t.setDate(1)
         st = t
         return {
              st: formalDate1(st),
              et: formalDate1(et)
         };
      }
      var i = 12
      while (i > 0) {
          monthList[i] = getLast(endDate)
          // 更新endDate的值
          endDate = new Date(monthList[i].st)
          i--
      }
      return monthList
}
console.log(countMonthList(2019))
3)根據(jù)給定年份計算當前年份的周數(shù):
function countWeekNum(year) {
    var total = (year % 4 || year % 100) ? 365 : 366 // 計算當前年份的總天數(shù)
    var first = (new Date(year, 0, 1, 0)).getDay() // 獲取當前年份第一天是周幾
    var last = (new Date(year, 11, 31, 23)).getDay() // 計算當前年份最后一天是周幾
    first = first === 0 ? 7 : first // getDay()返回日期為0~7伙窃,需重置以便后續(xù)計算
    // 如果最后一天是周日,只需減去first的相關值
    // 默認從當前年份的第一個周一開始計算样漆,例如2019年1月1日是周二对供,總天數(shù)total需減去6
    if (last === 0) {
         return parseInt((total - (8 - first)) / 7)
    } else { 
         // 如果最后一天不是周日,總天數(shù)total需同時減去first和last的相關值氛濒,并在結果中加1
         // 2019年最后一周為2019-12-30-2020-12-31
         return parseInt((total - (8 - first) - last) / 7 + 1)
    }
 }
 console.log(countWeekNum2(2019)) // 52
4)根據(jù)當前日期計算當前月份的時間段:
// 根據(jù)當前日期計算當前月份的時間段:2019-02-01~2019-02-28
function countDayNum() {
    var curDate = new Date() // 獲取當前日期
    // 獲取當前月份最后一天的日期,setDate(0):設置為上個月最后一天
    var last = new Date(curDate.setMonth(curDate.getMonth() + 1))
    var last = new Date(curDate.setDate(0))
    var dayNum = last.getDate() // 獲取當前月份的總天數(shù)
    var first = new Date(last.getFullYear(), last.getMonth(), 1) // 獲取當前月份第一天的日期
    return [parseToPhpDate(first), parseToPhpDate(last), dayNum]
}
console.log(countDayNum2())
5)根據(jù)當前日期計算當前周的時間段:
// 根據(jù)當前日期計算當前周的時間段
// new Date(2019,1,29) === new Date(2019,2,1)
function countDayNum2() {
    var curDate = new Date()
    var day = curDate.getDay() === 0 ? 7 : curDate.getDay()
    var mondayTime = new Date(curDate.setDate(curDate.getDate() - (day - 1)))
    var sundayTime = new Date(mondayTime.getFullYear(), mondayTime.getMonth(), mondayTime.getDate() + 6)
    return [parseToPhpDate(mondayTime), parseToPhpDate(sundayTime)]
}
console.log(countDayNum2()) // ["2019-03-18", "2019-03-24"]
6)根據(jù)當前日期獲取當前是今年的第幾周
// 根據(jù)當前日期獲取當前是今年的第幾周
function countCurweeknum() {
    var curDate = new Date()
    var first = new Date(curDate.getFullYear(), 0, 1) // 獲取當前年份第一天的日期
    while (first.getDay() !== 1) { // 獲取當前年份第一個周一的日期
         first.setDate(first.getDate() + 1)
    }
    // 獲取當前日期上一個周日的日期
    var last = new Date(curDate.setDate(curDate.getDate() - (curDate.getDay() === 0 ? 7 : curDate.getDay())))
    // 利用時間戳計算天數(shù)
    var weekNum = Math.ceil((last.getTime() - first.getTime()) / (7 * 1000 * 24 * 60 * 60)) + 1
    return weekNum
}
console.log(countCurweeknum()) // 11 2019-03-21
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末鹅髓,一起剝皮案震驚了整個濱河市舞竿,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌窿冯,老刑警劉巖骗奖,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異醒串,居然都是意外死亡执桌,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進店門芜赌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來仰挣,“玉大人,你說我怎么就攤上這事缠沈”旌” “怎么了错蝴?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長颓芭。 經(jīng)常有香客問我顷锰,道長,這世上最難降的妖魔是什么亡问? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任官紫,我火速辦了婚禮,結果婚禮上州藕,老公的妹妹穿的比我還像新娘束世。我一直安慰自己,他們只是感情好慎框,可當我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布良狈。 她就那樣靜靜地躺著,像睡著了一般笨枯。 火紅的嫁衣襯著肌膚如雪薪丁。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天馅精,我揣著相機與錄音严嗜,去河邊找鬼。 笑死洲敢,一個胖子當著我的面吹牛漫玄,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播压彭,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼睦优,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了壮不?” 一聲冷哼從身側響起汗盘,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎询一,沒想到半個月后隐孽,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡健蕊,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年菱阵,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片缩功。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡晴及,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出嫡锌,到底是詐尸還是另有隱情抗俄,我是刑警寧澤脆丁,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站动雹,受9級特大地震影響槽卫,放射性物質發(fā)生泄漏。R本人自食惡果不足惜胰蝠,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一歼培、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧茸塞,春花似錦躲庄、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至效扫,卻和暖如春倔监,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背菌仁。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工浩习, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人济丘。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓谱秽,卻偏偏與公主長得像,于是被迫代替她去往敵國和親摹迷。 傳聞我的和親對象是個殘疾皇子疟赊,可洞房花燭夜當晚...
    茶點故事閱讀 42,722評論 2 345

推薦閱讀更多精彩內(nèi)容