【JavaScript】Date 的使用

基础知识

  • GMT:Green Mean Time,格林威治时间,也叫世界标准时间。以太阳时为计时标准,精确到毫秒。
  • UTC:Universal Time Coordinated,世界协调时间。以原子时间为计时标准,精确到纳秒。

国际标准中,已全面使用 UTC 时间,而不再使用 GMT 时间。(但还是会以 GMT 的形式书写出来)


ISO 8601 标准规定,建议以 YYYY-MM-DDTHH:mm:ss:msZ 表示时间。

GMT、UTC、ISO 8601 表示的都是零时区的时间。


Unix 时间戳 (Unix Timestamp):UTC 时间 1970 年 1 月 1 日 0 时 0 分 0 秒 ~ 指定时间之间的毫秒数 (秒数)

Unix 时间戳这个概念最早由 Unix 系统提出


程序对时间的计算、存储务必使用 UTC 时间或时间戳。

在和用户交互时,再将 UTC 时间或时间戳转换为更友好的文本。



构造函数 Date

无参数

new Date():新创建的 Date 对象代表当前的日期和时间。

const date = new Date();
console.log(date); // "Mon Sep 04 2023 23:18:31 GMT+0800 (中国标准时间)"

时间或时间戳值

new Date(value)value 为时间戳。

const date = new Date(1693918599129); // "Tue Sep 05 2023 20:56:39 GMT+0800 (中国标准时间)"

new Date(dateString)dateString 为一个代表日期的字符串值,其格式由 Date.parse() 方法所识别。

const date1 = new Date('2019-05-27 20:30:25'); // "Mon May 27 2019 20:30:25 GMT+0800 (中国标准时间)"
const date2 = new Date('2019/05/27 20:30:25'); // "Mon May 27 2019 20:30:25 GMT+0800 (中国标准时间)"

日期对象

new Date(dateObject)dateObject 为一个 Date 实例。这等同于 new Date(dateObject.valueOf())

这实际上是在现有的 Date 对象上复制了一个相同的日期和时间。


日期和时间的单独值

new Date(year, monthIndex);
new Date(year, monthIndex, day);
new Date(year, monthIndex, day, hours);
new Date(year, monthIndex, day, hours, minutes);
new Date(year, monthIndex, day, hours, minutes, seconds);
new Date(year, monthIndex, day, hours, minutes, seconds, milliseconds);

给出至少一个年份和月份,任何缺失的字段都被赋予可能的最低值(day1,其他所有组件为 0)。

如果任何参数超过其定义的范围,会发生 “进位”。eg:new Date(1990, 12, 1) 将返回 1991 年 1 月 1 日。

类似的,如果任何参数不足其定义的范围,会从高位 “借位”。eg:new Date(2020, 5, 0) 将返回 2020 年 5 月 31 日。

  • year 表示年的整数。从 0 到 99 的值映射了 1900 到 1999 年。其他值对应真实的年份。
  • monthIndex 表示月份的整数,从代表一月的 0 开始到代表十二月的 11 结束。
  • day 表示一个月中第几天的整数。默认为 1。(可选)
  • hours 表示一天中的小时数的整数值,在 0 到 23 之间。默认为 0。(可选)
  • minutes 表示时间的分钟段的整数值。默认为 0。(可选)
  • seconds 表示时间的秒数段的整数值。默认为 0。(可选)
  • milliseconds 表示时间的毫秒段的整数值。默认为 0。(可选)

返回值

调用 new Date() 会返回一个 Date 对象。如果调用无效的日期字符串,或者如果要构建的日期的 UNIX 时间戳小于 -8,640,000,000,000 或大于 8,640,000,000,000 毫秒,它会返回一个 Date 对象,其 toString() 方法返回字面量字符串 Invalid Date。

调用 Date() 函数(没有 new 关键字)会返回当前日期和时间的字符串表示,就像 new Date().toString() 那样。调用 Date() 函数(没有 new 关键字)时给出的任何参数都会被忽略,总是返回一个当前日期和时间的字符串表示。



Date.prototype 身上的方法

toString

返回一个表示给定 Date 对象的字符串。

date.toString(); // "Tue Aug 19 1975 23:15:30 GMT+0800 (中国标准时间)"

valueOf

返回一个 Date 对象的原始值。

date.valueOf(); // 823230245000

所以,Date 实例之间可以直接使用操作符进行比较等操作:

const date1 = new Date(2019, 0, 1); // 2019 年 1 月 1 日
const date2 = new Date(2019, 1, 1); // 2019 年 2 月 1 日
console.log(date1 < date2); // true
console.log(date1 > date2); // false
const now = new Date();
const birthday = new Date(2000, 9, 30, 1, 2, 3);
const life = now - birthday;
console.log(life); // 655676695896



Date 身上的方法

now

Date.now 方法返回自 1970 年 1 月 1 日 00:00:00 (UTC) 到当前时间的毫秒数。

Date.now();

parse

Date.parse 方法解析一个表示某个日期的字符串,并返回从 1970-1-1 00:00:00 UTC 到该日期对象的 UTC 时间的毫秒数。

如果参数不能解析为一个有效的日期,则返回 NaN

Date.parse(dateString);

至今为止,不同宿主在如何解析日期字符串上仍存在许多差异,因此最好还是手动解析日期字符串。



格式化时间

toDateString

以美式英语和人类易读的形式返回一个日期字符串。

date.toDateString(); // "Thu Aug 19 2021"

toTimeString

以美式英语和人类易读的形式返回一个时间字符串。

date.toTimeString(); // "23:15:30 GMT+0800 (中国标准时间)"

toLocaleDateString

返回一个日期字符串,该字符串的格式因浏览器运行的本地环境而不同。

date.toLocaleDateString(); // "2021/8/9"

toLocateTimeString

返回一个时间字符串,该字符串的格式因浏览器运行的本地环境而不同。

date.toLocaleTimeString(); // "下午8:15:43"

toLocaleString

返回一个时期+时间字符串,该字符串的格式因浏览器运行的本地环境而不同。

date.toLocaleString(); // "2021/8/9 下午8:15:43"

toUTCString

返回一个时期+时间字符串,使用 UTC 时区。

date.toUTCString(); // "Wed, 14 Jun 2017 07:00:00 GMT"



获取时间

  1. date.getFullYear() 获取年份:
date.getFullYear(); // 2021

  1. date.getMonth() 获取月份:
date.getMonth(); // 7 → 实际月份为 8

月份的计数是从 0 开始,所以获取月份数字后 + 1,才是当前月份数值。


  1. date.getDate() 获取日期:
date.getDate(); // 9

  1. date.getHours() 获取小时:
date.getHours(); // 20

  1. date.getMinutes() 获取分钟:
date.getMinutes(); // 22

  1. date.getSeconds() 获取秒数:
date.getSeconds(); // 7

  1. date.getMilliseconds() 获取毫秒数:
date.getMilliseconds(); // 387

  1. date.getDay() 获取星期几:
date.getDay(); // 1

  1. date.getTime() 获取时间戳:
date.getTime(); // 1628511899284(1970 年 1 月 1 日 0 时 0 分 0 秒到现在的毫秒数)

  1. date.getTimezoneOffset() 获取格林威治时间与本地时间相差的分钟数:
date.getTimezoneOffset(); // -480 时区偏移,中国是东八区

  1. date.getYear() 获取 1900 至今相差的年份:
date.getYear(); // 121



设置时间

  1. date.setFullYear() 设置年份:
date.setFullYear(2017); // 返回时间戳

  1. date.setMonth() 设置月份(0 ~ 11):
date.setMonth(10); // 返回时间戳

如果传入的参数大于 11,将会减掉 11,并加一年


  1. date.setDate() 设置日期

  1. date.setHours() 设置小时

  1. date.setMinutes() 设置分钟

  1. date.setSeconds() 设置秒钟

  1. date.setMillisecond() 设置毫秒



demo

新年倒计时:

<div id="box"></div>
<script>
    let year = new Date().getFullYear(); // 获取当前年份
    let newYear = new Date(year + 1, 0, 1); // 获取下一年的元旦日期

    function time(target) {
        let now = new Date(); // 获取现在的时间
        let long = (target - now) / 1000; // 得到距离元旦的秒数
        let ss = Math.floor(long % 60); // 秒
        let mm = Math.floor((long / 60) % 60); // 分钟
        let hh = Math.floor((long / 60 / 60) % 24); // 小时
        let dd = Math.floor(long / 60 / 60 / 24); // 天数
        box.innerHTML = dd + '天' + hh + '小时' + mm + '分钟' + ss + '秒';
    }

    setInterval(time, 1000, newYear);
</script>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JS.Huang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值