第六章 标准库 6.6 Date 类型

6.6 Date 类型

在 JavaScript 中,Date 类型用于处理日期和时间。学习它还需要了解一些时间相关的概念,然后是 Date 类型提供的各种方法。首先看创建 Date 对象的几种方法:

  • 1 使用无参构造函数:创建一个表示当前日期和时间的 Date 对象。
    const currentDate = new Date();
  • 2 使用毫秒数作为参数:使用一个表示自 1970 年 1 月 1 日 00:00:00 UTC 以来的毫秒数来创建 Date 对象。
const timestamp = 1627074374083; // 2021-07-24 14:52:54.083 UTC
const date = new Date(timestamp);
  • 3 使用表示日期和时间的字符串作为参数:使用一个表示日期和时间的字符串来创建 Date 对象。字符串的格式可以是标准格式,如 ISO 格式,或者自定义格式。
const date1 = new Date('2021-07-24T14:52:54.083Z'); // ISO 格式
const date2 = new Date('July 24, 2021 14:52:54'); // 自定义格式
  • 4 使用表示年、月、日、时、分、秒、毫秒的数字作为参数:使用年、月、日、时、分、秒、毫秒等数值来创建 Date 对象。
    const date = new Date(2021, 6, 24, 14, 52, 54, 83); // 2021-07-24 14:52:54.083
    参数取值范围如下:
    1 年份:四位数字表示的年份,取值范围为 0 到 9999。
    2 月份:0 表示一月,11 表示十二月,取值范围为 0 到 11。
    3 日期:月份中的日期,取值范围为 1 到 31。
    4 小时:取值范围为 0 到 23。
    5 分钟:取值范围为 0 到 59。
    6 秒数:取值范围为 0 到 59。
    7 毫秒数:取值范围为 0 到 999。
    需要注意的是,如果超出了有效的取值范围,JavaScript 会自动调整时间。例如,如果日期超出了月份中的最大值,JavaScript 会将日期调整为下一个月的第一天。如果月份超出了有效范围,JavaScript 会将年份和月份一起调整。因此,在使用 new Date() 构造函数时,应该确保参数的取值在合法的范围内,以避免意外的错误结果。

时间戳

1970 年 1 月 1 日 00:00:00 UTC 被称为“Unix 时间戳的起点”,因为它是 Unix 操作系统中使用的时间戳的起点。Unix 时间戳是一个表示自 1970 年 1 月 1 日 00:00:00 UTC 以来的秒数的整数,它被广泛地用于操作系统、编程语言等各种计算机系统中。
此外,UTC(协调世界时)是世界上最广泛使用的时间标准,被广泛地应用于全球各个地区的计算机系统中。因此,以 UTC 时间作为起点可以方便地处理跨时区的时间计算和表示。因此,1970 年 1 月 1 日 00:00:00 UTC 成为了计算机领域中的一个标准时间起点。
所以毫秒数为 0 就代表的是 1970 年 1 月 1 日 00:00:00 UTC
如果想要表示 1970 年 1 月 1 日 08:00:00 UTC 的时间戳则是 86060*1000,等于 28800000,是 8 小时乘以 60 分钟乘以 60 秒再乘以 1000 得到毫秒数。以下是毫秒与其他时间单位的换算关系:
1 秒 = 1000 毫秒
1 分钟 = 60 秒 = 60,000 毫秒
1 小时 = 60 分钟 = 3,600 秒 = 3,600,000 毫秒
1 天 = 24 小时 = 1,440 分钟 = 86,400 秒 = 86,400,000 毫秒

UTC 时间

UTC(Coordinated Universal Time,协调世界时)是全球标准的时间标准,也是国际电信联盟规定的计时基准,是世界上所有地区的标准时间。UTC 的计时基准是原子钟,它的精度非常高,通常能够精确到纳秒级别。
UTC 的定义基于原子钟,不受任何政治或地理条件的影响。UTC 的时间是通过全球各地的天文台、GPS 等精密仪器获取的,并使用时区来进行标准化。
UTC 的时间格式是基于 ISO 8601 标准的,以 1970 年 1 月 1 日 00:00:00 UTC 为零点,表示自那时起的秒数。例如,2021 年 4 月 5 日 10:30:00 UTC 的时间表示为 1617619800。
在编程中,通常使用 UTC 时间来进行存储和计算,并使用时区来进行显示和交互。这是因为 UTC 是全球标准时间,不会受到时区差异的影响,而且它可以方便地进行时间计算和比较。但是,在显示和交互时,需要将 UTC 时间转换为本地时区的时间,以便用户能够理解和使用。

ISO 8601 格式字符串

ISO 8601 格式字符串是一种标准的日期和时间表示格式,由国际标准化组织(ISO)定义。它的格式如下:
YYYY-MM-DDTHH:mm:ss.sssZ
其中,YYYY 表示年份,MM 表示月份,DD 表示日期,HH 表示小时数(24 小时制),mm 表示分钟数,ss 表示秒数,sss 表示毫秒数,Z 表示时区(如 +0800 表示东八区,-0700 表示西七区)。其中,年份和月份是必须的,其他部分可以省略。
还有一种表示日期对象字符串格式,它遵循标准的 RFC 1123 日期时间格式,它的形式为:ddd, dd mmm yyyy hh:mm:ss GMT,其中:
1 ddd 表示星期几的缩写,例如 Mon、Tue 等;
2 dd 表示日期;
3 mmm 表示月份的缩写,例如 Jan、Feb 等;
4 yyyy 表示年份;
5 hh 表示小时数,24 小时制;
6 mm 表示分钟数;
7 ss 表示秒数。
例如,一个示例为:Wed, 06 Apr 2022 02:30:00 GMT,表示 2022 年 4 月 6 日 2 点 30 分 0 秒 GMT 时间。
GMT(Greenwich Mean Time)和 UTC(Coordinated Universal Time)都是国际标准时间,它们在表示时间上是相同的,但是在计算上存在一些微小的差异。
GMT 是一个时区,以英国伦敦的格林威治天文台为基准,是一个地方时间标准。在过去,GMT 是全球标准时间的基准,但在现代计算机和通讯技术中,UTC 逐渐成为全球标准时间的基准。
UTC 是一个基于原子钟的全球标准时间,以秒为单位计算,不受任何政治或地理条件的影响。它是通过精密的原子钟和全球各地的天文台获取的,使用时区来进行标准化。UTC 的时间精度非常高,通常能够精确到纳秒级别。
GMT 和 UTC 的主要差异在于时刻的定义方式。GMT 是以地球自转为基础的时间标准,它的时刻定义方式是根据地球自转一周的时间来计算。而 UTC 是以原子钟为基础的时间标准,它的时刻定义方式是根据原子钟的时间来计算,每隔一段时间会通过闰秒等方式进行调整,以确保它与 GMT 的差距不会超过 0.9 秒。在实践中,UTC 和 GMT 通常是相同的,只有在进行非常精确的时间计算时才需要考虑它们之间的微小差异。
自定义格式是指用户自己定义的一种日期和时间表示格式,可以根据自己的需要指定日期和时间的各个部分,只要是能被 Date.parse() 方法解析的字符串,都可以作为参数传递给 Date 构造函数来创建 Date 对象。Date.parse() 方法会尝试将输入的字符串解析成一个表示日期和时间的数字,这个数字表示自 1970 年 1 月 1 日 00:00:00 UTC 起经过的毫秒数,如果解析成功则返回该数字,否则返回 NaN。例如:

new Date('APR, 04, 2023'): 自定义格式,表示 2023 年 4 月 4 日。
new Date('2023/4/4'): 自定义格式,表示 2023 年 4 月 4 日。
new Date('April, 04, 2023'): 自定义格式,表示 2023 年 4 月 4 日。
new Date('2023-04-04'): ISO 8601 格式,表示 2023 年 4 月 4 日。

自定义格式通常使用在特定的应用程序或文化中,不具有通用性,因此在跨平台和跨文化的场景中,ISO 8601 格式更为常用和推荐。

时区的概念

时区是一个地理区域,用于描述一个相对于 UTC(协调世界时)的标准时间偏移量。UTC 是一种全球统一的时间标准,用于协调全球各地的时间计算。
由于地球的自转是有规律的,因此地球上的不同地区在不同的时间经过相同的太阳高度角和光照强度变化。为了方便交流和计算,全球被划分成了 24 个时区,每个时区覆盖 15 度的经度范围。每个时区都有一个代表该时区标准时间的主要城市,该城市的时间被认为是这个时区的标准时间。
每个时区与 UTC 的时间偏移量可能是整小时或半小时,也可能是 15 分钟或其他时间间隔。例如中国使用了 UTC+8 时区,也称为东八区。这意味着中国时间比 UTC 时间快 8 个小时,例如当 UTC 时间为 2023 年 4 月 4 日 00:00:00 时,中国时间为 2023 年 4 月 4 日 08:00:00。

转字符串系列方法

Date 类的原型中有一系列以 to 开头的方法,作用是输出日期的字符串格式。

toISOString

toISOString() 方法返回一个按照国际标准 ISO 8601 格式表示的日期字符串,即 “yyyy-mm-ddThh:mm:ss.sssZ”,其中 “T” 表示日期和时间的分界线,”Z” 表示使用 UTC 时间。例如:
const now = new Date();
const isoString = now.toISOString();
console.log(isoString); // 输出类似 “2023-04-05T09:42:48.293Z” 的字符串

可以看到,toISOString() 方法返回的字符串中包含了年、月、日、时、分、秒和毫秒的信息,并以 “Z” 结尾,表示这是 UTC 时间。可以用这个方法来将 Date 对象转换为字符串,并方便地进行数据传输和存储。

toJSON

toJSON 方法与 toISOString 方法的返回结果完全相同。

toUTCString

toUTCString() 方法返回一个表示该日期对象的 UTC 时间的字符串,遵循标准的 RFC 1123 日期时间格式。具体格式为 “ddd, dd MMM yyyy HH:mm:ss GMT”,例如:new Date(‘2023-04-05T12:34:56Z’).toUTCString() 将返回 “Tue, 05 Apr 2023 12:34:56 GMT”。

toTimeString

toTimeString 方法返回的是日期对象的 UTC 时间的字符串的时分秒和时区部分,返回的字符串格式为 “hh:mm:ss GMT+XXXX”,其中 “hh:mm:ss” 表示时、分、秒,GMT+XXXX 表示当前时区偏移量。例如:
const date = new Date();
const timeString = date.toTimeString();
console.log(timeString); // “20:10:40 GMT+0800 (中国标准时间)”

toDateString

toTimeString 方法返回的是日期对象的 UTC 时间的字符串的年月日和星期几部分,例如:
const date = new Date();
console.log(date.toDateString()); // “Wed Apr 05 2023”

以上这些方法返回的都是 UTC 0 时区时间的字符串,下面讲到的方法都是返回本地所在时区的时间字符串。例如中国是东八区。

toLocaleString

toLocaleString() 方法是 Date 对象的一个内置函数,用于将日期时间转换成本地格式的字符串。
该方法的语法如下:
dateObj.toLocaleString([locales[, options]])
其中,参数 locales 是一个字符串或字符串数组,用于指定语言环境;options 是一个对象,用于指定一些格式化选项。
如果不指定任何参数,则该方法默认将日期时间转换成本地格式的字符串。如果指定了 locales 参数,则会根据指定的语言环境将日期时间转换成相应的本地格式字符串。如果还指定了 options 参数,则可以进一步控制格式化的方式。
例如,下面是将一个日期时间对象转换成本地格式字符串的示例:

const date = new Date('2022-04-06T12:34:56');


const dateString = date.toLocaleString();
console.log(dateString); //输出 2022/4/6 12:34:56

在这个示例中,toLocaleString() 方法将日期时间对象 date 转换成本地格式字符串,并将结果赋值给变量 dateString。由于没有指定语言环境和选项,因此该方法默认使用了当前环境的设置。
如果需要指定语言环境,可以将一个合法的语言标签字符串作为 locales 参数传入,例如:

const date = new Date('2022-04-06T12:34:56');


const options = {

  weekday: 'long',

  year: 'numeric',

  month: 'long',

  day: 'numeric',

};

const dateString = date.toLocaleString('en-US', options);
console.log(dateString); // 输出 Wednesday, April 6, 2022

在这个示例中,toLocaleString() 方法将日期时间对象 date 转换成德语环境下的本地格式字符串,并将结果赋值给变量 dateString。为了进一步控制格式化的方式,还传入了一个选项对象 options,其中指定了要显示星期几、年月日的详细信息。
需要注意的是,toLocaleString() 方法返回的字符串格式是因环境而异的,不同语言环境下的格式可能会有所不同。因此,在使用该方法时需要考虑到不同的环境设置。

locales 参数

locales 参数用于设置所需的语言环境,可以传递一个或多个区域设置标识符,也可以使用 navigator.language 属性自动检测用户的首选语言。常见的区域设置标识符有:
1 “en”:英语
2 “zh”:中文
3 “ja”:日语
4 “ko”:韩语
5 “de”:德语
6 “fr”:法语
7 “es”:西班牙语
8 “pt”:葡萄牙语
9 “it”:意大利语
10 “ru”:俄语
11 “ar”:阿拉伯语

例如

const date = new Date('2022-04-06T12:34:56');


const options = {

  weekday: 'long',

  year: 'numeric',

  month: 'long',

  day: 'numeric',

};

console.log(date.toLocaleString('cn', options)); // 输出 2022年4月6日星期三
console.log(date.toLocaleString('en', options)); // 输出 Wednesday, April 6, 2022
console.log(date.toLocaleString('ko', options)); // 输出 2022년 4월 6일 수요일

options 参数

包含一些选项来定制输出字符串的格式。常见的选项有:
1 dateStyle:日期的风格,可以设置为 “full”、”long”、”medium”、”short”,分别表示完整格式、长格式、中等格式和短格式,默认值为 “undefined”。
2 timeStyle:时间的风格,可以设置为 “full”、”long”、”medium”、”short”,分别表示完整格式、长格式、中等格式和短格式,默认值为 “undefined”。
3 weekday:是否包含星期几,可以设置为 “narrow”、”short” 或 “long”,默认值为 “undefined”。
4 year:年份的显示方式,可以设置为 “numeric”、”2-digit” 或 “undefined”。
5 month:月份的显示方式,可以设置为 “numeric”、”2-digit”、”narrow”、”short” 或 “long”,默认值为 “undefined”。
6 day:日期的显示方式,可以设置为 “numeric” 或 “2-digit”,默认值为 “undefined”。
7 hour:小时的显示方式,可以设置为 “numeric” 或 “2-digit”,默认值为 “undefined”。
8 minute:分钟的显示方式,可以设置为 “numeric” 或 “2-digit”,默认值为 “undefined”。
9 second:秒数的显示方式,可以设置为 “numeric” 或 “2-digit”,默认值为 “undefined”。
10 hour12:是否使用 12 小时制,可以设置为 true 或 false,默认值为 “undefined”。
11 timeZone:时区的显示方式,可以设置为 “numeric”、”short” 或 “long”,默认值为 “undefined”。
实际的开发过程中很少设置 locales 和 options 参数。

toLocaleTimeString

toLocaleTimeString 和 toLocaleString 区别是不返回年月日,只返回时分秒。
它的函数签名如下:
date.toLocaleTimeString([locales[, options]])
其中:

  • 1 locales:可选参数,和 toLocaleString 中一致。
  • 2 options:可选参数,一个对象,用于指定一些格式化选项。它的属性也是 toLocaleString 方法中的子集,该对象具有以下属性:
    hour12:一个布尔值,表示是否使用 12 小时制。默认为 true,即使用 12 小时制。如果设置为 false,则使用 24 小时制。
    hourCycle:一个字符串,表示要使用的小时制。可选值为 “h11″、”h12″、”h23” 和 “h24″,分别表示 12 小时制(am/pm)、12 小时制(上午/下午)、24 小时制和 24 小时制(从 0 开始)。默认值为 “h12″。
    timeZone:一个字符串,表示要使用的时区。如果未指定此属性,则使用运行时环境的默认时区。该属性可以是一个 IANA 时区名称,例如 “Asia/Shanghai”,也可以是 “UTC” 或 “GMT” 等时间偏移量表示法。
    timeZoneName:一个字符串,表示要在输出中包含的时区名称类型。可选值为 “short”、”long” 和 “narrow”,分别表示短、长和超短名称。默认为 undefined,即不包含时区名称。
    例如:
const date = new Date();


console.log(date.toLocaleTimeString('en', { hour12: true }));
// 输出:7:53:40 PM
console.log(date.toLocaleTimeString('zh', { hourCycle: 'h24' }));
// 输出:19:53:40
console.log(date.toLocaleTimeString('en', { timeZone: 'UTC' }));
// 输出:11:53:40 AM
console.log(date.toLocaleTimeString('en', { timeZoneName: 'long' }));
// 输出:7:53:40 PM China Standard Time

toLocaleDateString

toLocaleDateString 和 toLocaleString 区别是不返回时分秒,只返回年月日。
它的函数签名如下:
date.toLocaleDateString([locales[, options]])
其中:
locales:可选参数,和 toLocaleString 中一致。
options:可选参数,一个对象,用于配置日期格式的选项,选项值和 toLocaleString 中介绍的一致,常用的包括 weekday、year、month、day 等等。

const date = new Date();


console.log(date.toLocaleDateString()); // 2023/4/5
console.log(date.toLocaleDateString('en', { weekday: 'short' })); // Wed
console.log(date.toLocaleDateString('en', { weekday: 'narrow' })); // W
console.log(date.toLocaleDateString('en', { year: '2-digit' })); // 23
console.log(date.toLocaleDateString('en', { month: 'long' })); // April
console.log(date.toLocaleDateString('en', { day: 'numeric' })); // 5

获取当地时间值的方法

1 getFullYear() 会返回一个四位数的年份,表示的是当地时间的年份,例如 2023。
2 getYear() 已经被弃用,不应该再使用。它返回的是距离 1900 年的年数,例如 123 表示 2023 年(1900+123)。
3 getMonth() 返回的是当地时间的月份,从 0 开始计数,例如 0 表示一月。
4 getDay() 返回的是当地时间的星期几,从 0(星期日)到 6(星期六)。
5 getDate() 返回的是当地时间的日期,从 1 开始计数,例如 5 表示这个月的第 5 天。
6 getHours() 返回的是当地时间的小时数,从 0 到 23。
7 getMinutes() 返回的是当地时间的分钟数,从 0 到 59。
8 getSeconds() 返回的是当地时间的秒数,从 0 到 59。
8 getMilliseconds() 返回的是当地时间的毫秒数,从 0 到 999。
例如:

const now = new Date('2023-04-05T12:25:54.799Z');
console.log(now.getFullYear()); // 2023
console.log(now.getMonth()); // 3
console.log(now.getDay()); //3
console.log(now.getDate()); // 5
console.log(now.getHours()); // 20 因为是东八区 所以是晚上20点
console.log(now.getMinutes()); // 25
console.log(now.getSeconds()); // 54
console.log(now.getMilliseconds()); // 799

获取 UTC 时间值的方法

对应获取当地时间值的方法,同样有获取 UTC 时间值的方法。
1 getUTCFullYear():返回 UTC 日期中的年份(四位数字)。
2 getUTCMonth():返回 UTC 日期中的月份(0-11 之间的数字)。
3 getUTCDay():返回 UTC 日期中的星期几(0-6 之间的数字,其中 0 代表星期日)。
4 getUTCDate():返回 UTC 日期中的日(1-31 之间的数字)。
5 getUTCHours():返回 UTC 时间中的小时(0-23 之间的数字)。
6 getUTCMinutes():返回 UTC 时间中的分钟(0-59 之间的数字)。
7 getUTCSeconds():返回 UTC 时间中的秒(0-59 之间的数字)。
8 getUTCMilliseconds():返回 UTC 时间中的毫秒数(0-999 之间的数字)。

设置本地时间值的方法

1 setFullYear(year [, month [, day]]):
用于设置当前日期的年份。可选的参数 month 和 day 可以用来同时设置月份和日期。如果不指定月份和日期,则默认为 1 月 1 日。
取值范围:
year: 整数,表示年份。
month: 整数,表示月份,范围为 0~11。如果超出这个范围,会自动调整年份和月份。
day: 整数,表示日期,范围为 1~31。如果超出这个范围,会自动调整年份、月份和日期
2 setMonth(month [, day]):
用于设置当前日期的月份。可选的参数 date 可以用来同时设置日期。如果不指定日期,则默认为 1 日。
取值范围:
month: 整数,表示月份,范围为 0~11。如果超出这个范围,会自动调整年份和月份。
day: 整数,表示日期,范围为 1~31。如果超出这个范围,会自动调整年份、月份和日期。
3 setDate(date):
用于设置当前日期的日期部分(日)。传入一个整数值,表示要设置的日期值,取值范围为 1~31。
4 setHours(hour [, min [, sec [, ms]]]):
用于设置当前日期的时间部分的小时数。可选的参数 min、sec 和 ms 可以用来同时设置分钟、秒和毫秒。如果不指定这些参数,则默认设置为 0。
取值范围:
hour: 整数,表示小时数,范围为 0~23
min: 整数,表示分钟数,范围为 0~59。如果超出这个范围,会自动调整小时数和分钟数。
sec: 整数,表示秒数,范围为 0~59。如果超出这个范围,会自动调整小时数、分钟数和秒数。
ms: 整数,表示毫秒数,范围为 0~999。如果超出这个范围,会自动调整小时数、分钟数、秒数和毫秒数。
5 setMinutes(min [, sec [, ms]]):
用于设置当前日期的时间部分的分钟数。可选的参数 sec 和 ms 可以用来同时设置秒和毫秒。如果不指定这些参数,则默认设置为 0。
取值范围:
min: 整数,表示分钟数,范围为 0~59。如果超出这个范围,会自动调整小时数和分钟数。
sec: 整数,表示秒数,范围为 0~59。如果超出这个范围,会自动调整小时数、分钟数和秒数。
ms: 整数,表示毫秒数,范围为 0~999。如果超出这个范围,会自动调整小时数、分钟数、秒数和毫秒数。
6 setSeconds(sec [, ms]):
用于设置当前日期的时间部分的秒数。可选的参数 ms 可以用来同时设置毫秒。如果不指定这些参数,则默认设置为 0。
取值范围:
• sec: 整数,表示秒数,范围为 0~59。如果超出这个范围,会自动调整小时数、分钟数和秒数。
• ms: 整数,表示毫秒数,范围为 0~999。如果超出这个范围,会自动调整小时数、分钟数、秒数和毫秒数。
7 setMilliseconds(ms):
用于设置当前日期的毫秒数。
取值范围:整数,表示毫秒数,范围为 0~999
设置 UTC 时间值的方法
对应上面设置本地时间值的方法,同样都有对应的设置 UTC 时间值的方法:
setUTCFullYear
setUTCMonth
setUTCDate
setUTCHours
setUTCMinutes
setUTCSeconds
setUTCMilliseconds
参数都是一样的,就不再具体介绍。

获取和设置时间戳

getTime()和 setTime()都是 Date 对象的方法,用于获取或设置日期对象的时间值,时间值是指自 1970 年 1 月 1 日 00:00:00 UTC 以来经过的毫秒数。
1 getTime(): 返回当前日期对象的时间值,时间值是指自 1970 年 1 月 1 日 00:00:00 UTC 以来经过的毫秒数。
举例:

const date = new Date('2023-04-05T08:13:32Z');
const timeValue = date.getTime(); // 返回时间值: 1680682412000

2 setTime(timeValue): 设置当前日期对象的时间值。该方法接受一个表示时间值的参数,单位是毫秒。
举例:

const date = new Date();


console.log(date); // Wed Apr 05 2023 21:47:08 GMT+0800 (中国标准时间)
const date2 = new Date('2023-04-05T08:13:32Z');
date.setTime(date2.getTime()); //
console.log(date); // 输出: Wed Apr 05 2023 16:13:32 GMT+0800 (中国标准时间)

例子中把 date 对象设置成了 date2 的时间戳,则再打印 date 时 返回的时间就是 date2 的时间。

在实际开发过程中,如果是把时间类型存到数据库中,通常存储的就是时间戳或者 UTC 格式的字符串,这样再展示的时候再根据不同的时区展示成本地时间,如果存成本地之间,则在不同时区就会有时区的问题。

Date 类型上还有一个静态方法 可以直接获取当前时间的时间戳 Date.now(),它等价于调用 new Date().getTime(),但是更加高效,因为它不创建一个新的 Date 对象。

© 版权声明
THE END
喜欢就支持一下吧
点赞0

Warning: mysqli_query(): (HY000/3): Error writing file '/tmp/MYvDzKrR' (Errcode: 28 - No space left on device) in /www/wwwroot/583.cn/wp-includes/class-wpdb.php on line 2345
admin的头像-五八三
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

图形验证码
取消
昵称代码图片