CD's blog CD's blog
首页
  • HTMLCSS
  • JavaScript
  • Vue
  • TypeScript
  • React
  • Node
  • Webpack
  • Git
  • Nestjs
  • 小程序
  • 浏览器网络
  • 学习笔记

    • 《TypeScript 从零实现 axios》
    • Webpack笔记
  • JS/TS教程

    • 《现代JavaScript》教程
🔧工具方法
  • 网站
  • 资源
  • Vue资源
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

CD_wOw

内卷的行情,到不了的梦
首页
  • HTMLCSS
  • JavaScript
  • Vue
  • TypeScript
  • React
  • Node
  • Webpack
  • Git
  • Nestjs
  • 小程序
  • 浏览器网络
  • 学习笔记

    • 《TypeScript 从零实现 axios》
    • Webpack笔记
  • JS/TS教程

    • 《现代JavaScript》教程
🔧工具方法
  • 网站
  • 资源
  • Vue资源
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 简介

  • JavaScript 基础知识

  • 数据类型

    • 原始数据的方法
    • 数组方法
    • 搜索(过滤)方法
    • 转换数组
    • Object.keys、values、entries
    • 数字类型
    • Iterable object(可迭代对象
    • 解构赋值
    • Map and Set(映射和集合)
    • 日期和时间
      • 创建
      • 访问日期组件
      • 设立日期组件
      • 自动校准(Autocorrection)
    • 数组
    • WeakMap and WeakSet(弱映射和弱集合)
  • 函数进阶内容

  • 对象属性配置

  • 原型,继承

  • 类

  • 错误处理

  • Promise,asyncawait

  • Generator,高级 iteration

  • 模块

  • 杂项

  • 《现代JavaScript》教程
  • 数据类型
CD_wOw
2020-12-12
目录

日期和时间

# 创建

创建一个新的 Date 对象,只需要调用 new Date(),在调用时可以带有下面这些参数之一:

  • new Date()

    不带参数 —— 创建一个表示当前日期和时间的 Date 对象:

let now = new Date();
alert( now ); // 显示当前的日期/时间
1
2

new Date(milliseconds)

创建一个 Date 对象,其时间等于 1970-01-01 00:00:00 UTC+0 再过一毫秒(1/1000 秒)。

// 0 表示 01.01.1970 UTC+0
let Jan01_1970 = new Date(0);
alert( Jan01_1970 );

// 现在增加 24 小时,得到 02.01.1970 UTC+0
let Jan02_1970 = new Date(24 * 3600 * 1000);
alert( Jan02_1970 );
1
2
3
4
5
6
7

传入的整数参数代表的是自 1970-01-01 00:00:00 以来经过的毫秒数,该整数被称为 时间戳。

这是一种日期的轻量级数字表示形式。我们通常使用 new Date(timestamp) 通过时间戳来创建日期,并可以使用 date.getTime() 将现有的 Date 对象转化为时间戳(下文会讲到)。

在 01.01.1970 之前的日期带有负的时间戳,例如:

// 31 Dec 1969
let Dec31_1969 = new Date(-24 * 3600 * 1000);
alert( Dec31_1969 );
1
2
3

new Date(datestring)

如果只有一个参数,并且是字符串,那么它会被自动解析。该算法与 Date.parse 所使用的算法相同,我们将在下文中进行介绍。

let date = new Date("2017-01-26");
alert(date);
// 该时间未被设定,因此被假定为格林尼治标准时间(GMT)的午夜(midnight)
// 并会根据你运行代码时的时区进行调整
// 因此,结果可能是
// Thu Jan 26 2017 11:00:00 GMT+1100 (Australian Eastern Daylight Time)
// 或
// Wed Jan 25 2017 16:00:00 GMT-0800 (Pacific Standard Time)
1
2
3
4
5
6
7
8

new Date(year, month, date, hours, minutes, seconds, ms)

使用当前时区中的给定组件创建日期。只有前两个参数是必须的。

  • year 必须是四位数:2013 是合法的,98 是不合法的。
  • month 计数从 0(一月)开始,到 11(十二月)结束。
  • date 是当月的具体某一天,如果缺失,则为默认值 1。
  • 如果 hours/minutes/seconds/ms 缺失,则均为默认值 0。

例如:

new Date(2011, 0, 1, 0, 0, 0, 0); // 1 Jan 2011, 00:00:00
new Date(2011, 0, 1); // 同样,时分秒等均为默认值 0
1
2

时间度量最大精确到 1 毫秒(1/1000 秒):

let date = new Date(2011, 0, 1, 2, 3, 4, 567);
alert( date ); // 1.01.2011, 02:03:04.567
1
2

# 访问日期组件

从 Date 对象中访问年、月等信息有多种方式:

getFullYear() (opens new window)

获取年份(4 位数)

getMonth() (opens new window)

获取月份,从 0 到 11。

getDate() (opens new window)

获取当月的具体日期,从 1 到 31,这个方法名称可能看起来有些令人疑惑。

getHours() (opens new window),getMinutes() (opens new window),getSeconds() (opens new window),getMilliseconds() (opens new window)

获取相应的时间组件。

不是 getYear(),而是 getFullYear()

很多 JavaScript 引擎都实现了一个非标准化的方法 getYear()。不推荐使用这个方法。它有时候可能会返回 2 位的年份信息。永远都不要使用它。要获取年份就使用 getFullYear()。

另外,我们还可以获取一周中的第几天:

  • getDay() (opens new window)

    获取一周中的第几天,从 0(星期日)到 6(星期六)。第一天始终是星期日,在某些国家可能不是这样的习惯,但是这不能被改变。

以上的所有方法返回的组件都是基于当地时区的。

当然,也有与当地时区的 UTC 对应项,它们会返回基于 UTC+0 时区的日、月、年等:getUTCFullYear() (opens new window),getUTCMonth() (opens new window),getUTCDay() (opens new window)。只需要在 "get" 之后插入 "UTC" 即可。

如果你当地时区相对于 UTC 有偏移,那么下面代码会显示不同的小时数:

//  当前日期
let date = new Date();

// 当地时区的小时数
alert( date.getHours() );

// 在 UTC+0 时区的小时数(非夏令时的伦敦时间)
alert( date.getUTCHours() );
1
2
3
4
5
6
7
8

除了上述给定的方法,还有两个没有 UTC 变体的特殊方法:

getTime() (opens new window)

返回日期的时间戳 —— 从 1970-1-1 00:00:00 UTC+0 开始到现在所经过的毫秒数。

getTimezoneOffset() (opens new window)

返回 UTC 与本地时区之间的时差,以分钟为单位:

// 如果你在时区 UTC-1,输出 60
// 如果你在时区 UTC+3,输出 -180
alert( new Date().getTimezoneOffset() );
1
2
3

# 设立日期组件

下列方法可以设置日期/时间组件:

  • setFullYear(year, [month\], [date]) (opens new window)
  • setMonth(month, [date\]) (opens new window)
  • setDate(date) (opens new window)
  • setHours(hour, [min\], [sec], [ms]) (opens new window)
  • setMinutes(min, [sec\], [ms]) (opens new window)
  • setSeconds(sec, [ms\]) (opens new window)
  • setMilliseconds(ms) (opens new window)
  • setTime(milliseconds) (opens new window)(使用自 1970-01-01 00:00:00 UTC+0 以来的毫秒数来设置整个日期)

以上方法除了 setTime() 都有 UTC 变体,例如:setUTCHours()。

我们可以看到,有些方法可以一次性设置多个组件,比如 setHours。未提及的组件不会被修改。

举个例子:

let today = new Date();

today.setHours(0);
alert(today); // 日期依然是今天,但是小时数被改为了 0

today.setHours(0, 0, 0, 0);
alert(today); // 日期依然是今天,时间为 00:00:00。
1
2
3
4
5
6
7

# 自动校准(Autocorrection)

自动校准 是 Date 对象的一个非常方便的特性。我们可以设置超范围的数值,它会自动校准。

举个例子:

let date = new Date(2013, 0, 32); // 32 Jan 2013 ?!?
alert(date); // ……是 1st Feb 2013!
1
2

超出范围的日期组件将会被自动分配。

假设我们要在日期 “28 Feb 2016” 上加 2 天。结果可能是 “2 Mar” 或 “1 Mar”,因为存在闰年。但是我们不需要去考虑这些,只需要直接加 2 天,剩下的 Date 对象会帮我们处理:

let date = new Date(2016, 1, 28);
date.setDate(date.getDate() + 2);

alert( date ); // 1 Mar 2016
1
2
3
4

这个特性经常被用来获取给定时间段后的日期。例如,我们想获取“现在 70 秒后”的日期:

let date = new Date();
date.setSeconds(date.getSeconds() + 70);

alert( date ); // 显示正确的日期信息
1
2
3
4
编辑 (opens new window)
#现代JavaScript
上次更新: 2021/08/22, 01:09:59
Map and Set(映射和集合)
数组

← Map and Set(映射和集合) 数组→

最近更新
01
gsap动画库学习笔记 - 持续~
06-05
02
远程组件加载方案笔记
05-03
03
小程序使用笔记
03-29
更多文章>
Theme by Vdoing | Copyright © 2020-2023 CD | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式