Date 时间对象【电子时钟 / 倒计时效果 / 闰年的计算方法 / 某一月的周数】

时间对象:new Date()

获取当前用户的本地时间(用户的本地时间是不可靠的)
在真正的开发中,要获取服务器的时间(相对安全)

时间戳:

1970年01月01日00时00分00秒到当前的毫秒数

  • new Date().getTime(); // number类型
  • Date.now() // number类型

获取时间

下面获取的时间都是数字类型:

  • 获取当前的年份:
    t.getFullYear()
  • 获取当前的月份
    t.getMonth()
    注意:
    获取来的值少1个月份,所以要加1
  • 获取日
    t.getDate()
  • 获取周几
    t.getDay() 周日为0
  • 获取小时:
    t.getHours()
  • 获取分钟:
    t.getMinutes()
  • 获取秒:
    t.getSeconds()

例子:在页面中显示当前时间 ==> 2018年10月28日----周日----21点46分42秒

let arr = ['周日', '周一', '周二', '周三', '周四', '周五', '周六'];
console.log(['周日', '周一', '周二', '周三', '周四', '周五', '周六'][new Date().getDay()])
function fn() {
  let t = new Date();
  let y = t.getFullYear();
  let m = tDou(t.getMonth() + 1);
  let d = tDou(t.getDate());
  let h = tDou(t.getHours());
  let mi = tDou(t.getMinutes());
  let se = tDou(t.getSeconds());
  p.innerHTML = y + '年' + m + '月' + d + '日----' + arr[t.getDay()] + '----' + h + '点' + mi + '分' + se + '秒';
};

fn(); //上来直接执行,第一下不会闪

setInterval(fn, 1000);
/*
   小于10补0
/
function tDou(n) {
  return n < 10 ? '0' + n : '' + n;
}

倒计时

倒计时原理:

  1. 未来的时间
  2. 现在的时间(每分每秒都在动)
    未来的时间 - 现在的时间 = 剩下多少时间
    new Date(工作时这儿放服务器时间);

设置时间:
字符串:
new Date('年 月 日 时:分:秒')
new Date('2018 10 27 15:40:00')
数字版:
new Date(年, 月, 日, 时, 分, 秒)
new Date(2018, 9, 27, 15, 40)

注意:
设置月份的时候要减1

转换公式:

let d = Math.floor(t / 86400);
t %= 86400;
let h = Math.floor(t / 3600);
t %= 3600;
let m = Math.floor(t / 60);
t %= 60;

例子:在页面中显示到未来某个时间的倒计时 ==> 00天17时37分50秒

let newdate = new Date('2055 10 28 16:00:00'); // 未来的时间 
let timer = null;
function fn() {
  let nowDate = new Date(); // 现在的时间
  let t = Math.floor((newdate - nowDate) / 1000);
  if (t <= 0) {
    // 如果未来的时间 - 现在的时间 小于0,说明现在的时间已经超过了设置的时间,所以关闭定时器
    clearInterval(timer);
  } else {
    let d = Math.floor(t / 86400);   //1
    t %= 86400;
    let h = Math.floor(t / 3600);
    t %= 3600;
    let m = Math.floor(t / 60);
    t %= 60;
    p.innerHTML = tDou(d) + '天' + tDou(h) + '时' + tDou(m) + '分' + tDou(t) + '秒';
  };
};

fn(); // 上来就先调用一次,避免有闪的现象

timer = setInterval(fn, 1000); // 开启定时器

function tDou(n) {  // 补零
  return n < 10 ? '0' + n : '' + n;
};

设置时间

setYear()
setMonth()
setDate()
...

语法: Date.setDate(day) day 必填。
表示一个月中的一天的一个数值(1 ~ 31),0 为上一个月的最后一天,-1 为上一个月最后一天之前的一天。
如果当月有 31 天,32 为下个月的第一天。如果当月有 30 天,32 为下一个月的第二天。

求某一月份的天数

例子:求一个月有多少天,这个月有几天?

let d = new Date();
d.setDate(1) // 先设置成一号,避免出现计算下下个月的天数的情况
//(比如1月30天,而2月最大28天,此时用这个方法会跳过2月,进入3月份,)
d.setMonth(d.getMonth() + 1); // 设置成下个月
d.setDate(0);  // 代表上个月的最后一天  等于知道了这个月有多少天
console.log(d.getDate());

公历闰年计算方法:

  1. 普通年能被4整除且不能被100整除的为闰年。(如2004年就是闰年,1900年不是闰年)
  2. 世纪年能被400整除的是闰年。(如2000年是闰年,1900年不是闰年)
  3. 对于数值很大的年份,这年如果能整除3200,并且能整除172800则是闰年。

最后一条基本用不到,这样看来,转化成代码就是:

const year = new Date().getFullyear()
year % 4 === 0 && year % 100 !== 0 || year % 400 === 0

补充:闰年有366天,闰年的2月份有29天,平年为365天,2月份为28天。
  所以,可以用二月份的天数来判断是否为闰年

//获取指定月份的天数
const year = 2019
const endTime = new Date(`${year} 03 01 00:00:00`)
const startTime = new Date(`${year} 02 01 00:00:00`)
console.log(Math.floor((endTime - startTime) / 86400000))  //  28   (二月份的天数)

实例:求指定月份的周数?

  知识点1:每个月的第一天,所在的一整周,为第一周。(比如 2019-09 第一天是周日,那么这一整周都为9月份的第一周)

  知识点2:每个月的最后一周必须是满周的。不满一整周的天数,则不计入这个月份,多出来的天数,计入下一月的第一周。

  getWeeks(value) {
    const year = +value.slice(0, 4);
    const isLeapYear = year % 4 === 0 && year % 100 !== 0 || year % 400 === 0 ? true : false;
    const monthAry = [31, isLeapYear ? 29 : 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
    const supplementDay = [6, 0, 1, 2, 3, 4, 5];
    const num = monthAry[+value.slice(5) - 1];    //拿到本月的天数,
    const d = +moment(`${value}-01`).format("d"); //拿到每月的第一天是周几
    const t = supplementDay[d];  //得到第一周需要补全的天数
    const week = Math.floor((num + t) / 7); //得到本月的周数
    console.log(`${value}有${week}周`)
  }
  getWeeks("2019-08")
posted @ 2018-10-28 22:28  真的想不出来  阅读(463)  评论(0编辑  收藏  举报