有關(guān)時間的一些操作

有關(guān)時間的一些操作

本文無需說明理論知識,純簡化實(shí)操的代碼绿店,直接來看吧:

Date 傳入的參數(shù)需符合標(biāo)準(zhǔn),請見 IETF-compliant RFC 2822 timestampsversion of ISO8601

PS:傳入的參數(shù) date 需為 Date 對象的實(shí)例稍走,請先行轉(zhuǎn)化地技。
PPS:比如改變了天數(shù)蜈七,其實(shí) 時分秒并未改變,使用時請注意莫矗。(劃重點(diǎn))
PPPS:修改的是對象飒硅,為了避免操作的是同一個對象的數(shù)據(jù)棧砂缩,可以再 new Date() 一下。

處理 "/Date("xxxxxxxxx")/" 形態(tài)的時間戳三娩,一般出現(xiàn)在后端接口的數(shù)據(jù)里

function changeDate(datetime) {
  return new Date(parseInt(datetime.replace("/Date(", "").replace(")/", ""), 10));
}

計算變化多少天后的日期庵芭,秒/分/時/月 等都可同理

function DateAddDay(date, days) {
  var date = new Date(date);
  return new Date(date.setDate(date.getDate() + days));
}

本月第一天的日期

function FirstDay(date) {
  var date = new Date(date);
  return new Date(date.setDate(1));
}

本周周一的日期,本周周日等同理

function FirstDayInThisWeek(date) {
  var date = new Date(date);
  return DateAddDay(date, 1 - date.getDay());
}

計算某年某月有幾天(month 范圍 [1, 12]雀监,個人推薦按你的開發(fā)習(xí)慣進(jìn)行是否 -1 的改寫)

function HowMuchDay(month, year) {
  if (!year) year = new Date().getFullYear();
  var m = [31, null, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
  m[1] = (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) ? 29 : 28;
  return m[month - 1];
}

將 Date 轉(zhuǎn)換成字符串格式(但這里沒有自動補(bǔ)零双吆,需要的話請自行改寫)

// yyyy = 年  mm = 月 dd = 日 hh = 小時 nn = 分 ss = 秒
function ConvertDateToString(date, pattern) {
  var str = pattern;
  str = str.replace(/y{4}/i, date.getFullYear());
  str = str.replace(/m{2}/i, (date.getMonth()+1));
  str = str.replace(/d{2}/i, date.getDate());
  str = str.replace(/h{2}/i, date.getHours());
  str = str.replace(/n{2}/i, date.getMinutes());
  str = str.replace(/s{2}/i, date.getSeconds());
  return str;
}

自動補(bǔ)零

function addZero(num, n) {
    var len = num.toString().length || 2;
    while(len < n) {
        num = "0" + num; len++;
    }
    return num;
}

function addZero2(num, n) {
  if (Math.pow(10,n)<num) return num+'';
  return (Array(n).join(0) + num).slice(-n);
}

倒計時

var end = new Date(2017, (9-1), 8, 20, 0, 0);
var d = new Date(end - new Date());
setInterval(function(){
  d = new Date(d.setSeconds(d.getSeconds() - 1));
  if (d.getTime() > 0) console.log(d);
  else console.log(end);
}, 1000);

本身理論并不難,但需要注意以下幾點(diǎn):

  1. 月份記得要減 1
  2. 時間相減再 new 出來的時間是有時差的会前,比如最后一秒 getHours() 會為 8好乐,所以如果有天數(shù)和小時級別的倒計時要特別注意這個坑(劃重點(diǎn))
  3. 但擁有時差的 d 最后一秒 getTime()0,去掉了時差會為負(fù)數(shù)喲

所以我只能進(jìn)行了下面這種性能實(shí)在不佳的封裝

function dateAddSecond(date, second) {
  return new Date(date.setSeconds(date.getSeconds() + second));
}
function timecount(start, end, fn, cb) {
  var offset = end - start, Timer = null;
  var d = new Date(offset);
  var dd = new Date(offset);  // 處理時區(qū)問題
  dd = new Date(dd.setHours(dd.getHours() + dd.getTimezoneOffset() / 60));
  // 正式開始
  if (d.getTime() > -1) _begin();
  else { fn && fn(end, d); cb && cb(); }
  // 內(nèi)部方法
  function _begin() {
    fn && fn(dd, d);
    Timer = setInterval(_run, 1000);
  }
  function _run() {
    d = dateAddSecond(d, -1);
    dd = dateAddSecond(dd, -1);
    fn && fn(dd, d);
    if (d.getTime() < 1000) {
      _stop(); cb && cb();
    }
  }
  function _stop() {
    clearInterval(Timer);
  }
  return {
    start: _begin,
    stop: _stop,
  }
}

// ------ 倒計時運(yùn)行
var endTime = new Date(2017, (9-1), 6, 13, 35, 0);  // 這里修改結(jié)束時間
timecount(new Date(), endTime, function(left, raw){
  // left 為真實(shí)剩余時間瓦宜,raw 為時間相減本來得到的值
  console.log(left, raw.getTime());
});

再舉個栗子(制作日歷的原理之一)

以下代碼實(shí)現(xiàn)的是蔚万,從本月到往后五個月所有日期形成的二維數(shù)組。
其中 DateAddMonth 和 DateAddDay 是類似的方法临庇,就不再復(fù)寫了反璃。

var result = [];
var now = new Date();
var temp = FirstDay(now);  // 求取本月第一天,因?yàn)?31 號時的月份加減很容易出錯咯
for (var i=0; i<6; i++) {
  result[i] = [];
  var month = DateAddMonth(temp, i);  // 六個月第一天的日期
  var days = HowMuchDay(month.getMonth(), month.getFullYear());  // 當(dāng)月有多少天
  for (var j=0; j<days; j++) {
    result[i].push(DateAddDay(month, j));  // 當(dāng)月每一天放入數(shù)組中
  }
}
console.log(result);
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末苔巨,一起剝皮案震驚了整個濱河市版扩,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌侄泽,老刑警劉巖礁芦,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異悼尾,居然都是意外死亡柿扣,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進(jìn)店門闺魏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來未状,“玉大人,你說我怎么就攤上這事析桥∷静荩” “怎么了?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵泡仗,是天一觀的道長埋虹。 經(jīng)常有香客問我,道長娩怎,這世上最難降的妖魔是什么搔课? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮截亦,結(jié)果婚禮上爬泥,老公的妹妹穿的比我還像新娘柬讨。我一直安慰自己,他們只是感情好袍啡,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布踩官。 她就那樣靜靜地躺著,像睡著了一般葬馋。 火紅的嫁衣襯著肌膚如雪卖鲤。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天畴嘶,我揣著相機(jī)與錄音,去河邊找鬼集晚。 笑死窗悯,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的偷拔。 我是一名探鬼主播蒋院,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼莲绰!你這毒婦竟也來了欺旧?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤蛤签,失蹤者是張志新(化名)和其女友劉穎辞友,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體震肮,經(jīng)...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡称龙,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了戳晌。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鲫尊。...
    茶點(diǎn)故事閱讀 39,696評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖沦偎,靈堂內(nèi)的尸體忽然破棺而出疫向,到底是詐尸還是另有隱情,我是刑警寧澤豪嚎,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布搔驼,位于F島的核電站,受9級特大地震影響疙渣,放射性物質(zhì)發(fā)生泄漏匙奴。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一妄荔、第九天 我趴在偏房一處隱蔽的房頂上張望泼菌。 院中可真熱鬧谍肤,春花似錦、人聲如沸哗伯。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽焊刹。三九已至系任,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間虐块,已是汗流浹背俩滥。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留贺奠,地道東北人霜旧。 一個月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像儡率,于是被迫代替她去往敵國和親挂据。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,592評論 2 353

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