有關時間的一些操作

有關時間的一些操作

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

Date 傳入的參數需符合標準,請見 IETF-compliant RFC 2822 timestampsversion of ISO8601。

PS:傳入的參數 date 需為 Date 對象的實例,請先行轉化。
PPS:比如改變了天數,其實 時分秒并未改變,使用時請注意。(劃重點)
PPPS:修改的是對象,為了避免操作的是同一個對象的數據棧,可以再 new Date() 一下。

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

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ā)習慣進行是否 -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 轉換成字符串格式(但這里沒有自動補零,需要的話請自行改寫)

// 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;
}

自動補零

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);

本身理論并不難,但需要注意以下幾點:

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

所以我只能進行了下面這種性能實在不佳的封裝

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(); }
  // 內部方法
  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,
  }
}

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

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

以下代碼實現的是,從本月到往后五個月所有日期形成的二維數組。
其中 DateAddMonth 和 DateAddDay 是類似的方法,就不再復寫了。

var result = [];
var now = new Date();
var temp = FirstDay(now);  // 求取本月第一天,因為 31 號時的月份加減很容易出錯咯
for (var i=0; i<6; i++) {
  result[i] = [];
  var month = DateAddMonth(temp, i);  // 六個月第一天的日期
  var days = HowMuchDay(month.getMonth(), month.getFullYear());  // 當月有多少天
  for (var j=0; j<days; j++) {
    result[i].push(DateAddDay(month, j));  // 當月每一天放入數組中
  }
}
console.log(result);
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 國家電網公司企業(yè)標準(Q/GDW)- 面向對象的用電信息數據交換協(xié)議 - 報批稿:20170802 前言: 排版 ...
    庭說閱讀 12,444評論 6 13
  • SwiftDate概況 從Swift發(fā)布起,我們就沒有放棄使用Swift。 當然,我們希望在項目能夠輕松自如地管理...
    Mee_Leo閱讀 10,337評論 1 13
  • 春天濃重又熱鬧老是容易花粉過敏冬天太冷還愛起靜電脫毛衣的時候噼里啪啦響夏天的西瓜和短袖我一直都會想夜晚清涼的故事太...
    余公子_閱讀 180評論 0 0
  • 命和運的區(qū)別早已有了相對明確的說法:命是與生俱來的東西,生在帝王家就是王子,生在貧民家就是屌絲;運是后天存在變數又...
    KVC閱讀 855評論 1 6
  • 從兒時開始,生性貪玩的我最興奮的事情就是去陌生的地方,看陌生的風景。我享受陌生帶來的新鮮感,象漆黑夜空中的煙火,在...
    小番茄食堂閱讀 594評論 0 3

友情鏈接更多精彩內容