时间的表达方式

关于《时间》,有很多话题可以讨论:

- 比如物理学有《时间简史:从大爆炸到黑洞》,讲述的是关于宇宙的起源、命运;
- 比如文学上有《记念刘和珍君》:时间永是流驶,街市依旧太平;
- 比如音乐上有《时间都去哪儿了》:时间都去哪儿了,还没好好感受年轻就老了;

我们先来了解一下时间表示的基本概念:

最初,人们是通过观察太阳的位置来决定时间的,但是这种方式有一个最大的弊端就是不同区域位置大家使用的时间是不一致的。

- 相互之间没有办法通过一个统一的时间来沟通、交流。

之后,人们开始制定的标准时间是英国伦敦的皇家格林威治( Greenwich )天文台的标准时间(刚好在本初子午线经过的地方),这个时间也称之为GMT(Greenwich Mean Time)。

- 其他时区根据标准时间来确定自己的时间,往东的时区(GMT+hh:mm),往西的时区(GMT+hh:mm);

但是,根据公转有一定的误差,也会造成GMT的时间会造成一定的误差,于是就提出了根据原子钟计算的标准时间UTC(CoordinatedUniversal Time)

目前GMT依然在使用,主要表示的是某个时区中的时间,而UTC是标准的时间。

时区对比图

创建Date对象

在JavaScript中我们使用Date来表示和处理时间。

- Date的构造函数有如下用法:

    // 创建 Date 对象的方式
    // 1. 没有传入任何参数,获取到当前时间
    var date = new Date()

    console.log(date)

    // 2.传入参数:时间字符串
    var date2 = new Date('2021-12-19')

    console.log(date2)

    // 2.传入具体的年与日时分秒毫秒
    var date3 = new Date(2033, 10, 10, 08, 03, 07, 333)

    console.log(date3)

    // 4.传入时间戳
    // 1s -> 1000ms
    var date4 = new Date(10040435465)
    console.log(date4)

dateString时间的表示方式

日期的表示方式有两种:RFC 2822 标准 或者 ISO 8601 标准。

默认打印的时间格式是RFC 2822标准的:

我们也可以将其转化成ISO 8601标准的:

- YYYY:年份,0000 ~ 9999
- MM:月份,01 ~ 12
- DD:日,01 ~ 31
- T:分隔日期和时间,没有特殊含义,可以省略
- HH:小时,00 ~ 24
- mm:分钟,00 ~ 59
- ss:秒,00 ~ 59
- .sss:毫秒
- Z:时区

Date获取信息的方法

我们可以从Date对象中获取各种详细的信息:

- getFullYear():获取年份(4 位数);
- getMonth():获取月份,从 0 到 11;
- getDate():获取当月的具体日期,从 1 到 31(方法名字有点迷);
- getHours():获取小时;
- getMinutes():获取分钟;
- getSeconds():获取秒钟;
- getMilliseconds():获取毫秒;

获取某周中的星期几:

- getDay():获取一周中的第几天,从 0(星期日)到 6(星期六);

Date设置信息的方法

Date也有对应的设置方法:

- setFullYear(year, [month], [date])
- setMonth(month, [date])
- setDate(date)
- setHours(hour, [min], [sec], [ms])
- setMinutes(min, [sec], [ms])
- setSeconds(sec, [ms])
- setMilliseconds(ms)
- setTime(milliseconds)

了解:我们可以设置超范围的数值,它会自动校准。

	var date = new Date()

    console.log(date)
    console.log(date.toISOString())

    // 1.获取想要的时间信息
    var year = date.getFullYear()
    var mouth = date.getMonth() + 1
    var day = date.getDate()
    var hour = date.getHours()
    var minute = date.getMinutes()
    var seconde = date.getSeconds()
    
    console.log(year, mouth, day, hour, minute, seconde)
    console.log(`${year}, ${mouth}, ${day}, ${hour}, ${minute}, ${seconde}`)

    var weekDay = date.getDay() // 一周的第几天

    console.log(weekDay)

    // 2.也可以设置时间
    date.setFullYear(2033)
    
    // 自动校验
    date.setDate(31)

    console.log(date)

Date获取Unix时间戳

Unix 时间戳:它是一个整数值,表示自1970年1月1日00:00:00 UTC以来的毫秒数。

在JavaScript中,我们有多种方法可以获取这个时间戳:

- 方式一:new Date().getTime()
- 方式二:new Date().valueOf()
- 方式三:+new Date()
- 方式四:Date.now()

获取到Unix时间戳之后,我们可以利用它来测试代码的性能:

    // Date对象转成时间戳
    var date = new Date()
    var date2 = new Date('2033-04-03')

    // 方法一:当前时间的时间戳
    var timestamp1 = Date.now()
    console.log(timestamp1)

    // 方法二/方法三 将一个date 对象转成时间戳
    var timestamp2 = date.getTime()
    var timestamp3 = date2.valueOf()

    console.log(timestamp2, timestamp3)

    // 方法四: 了解
    console.log(+date)

    // 计算这个操作花费的时间
    var starTime = Date.now()
    
    for (var i = 0; i < 10000; i++) {
      console.log(i)
    }

    var endTime = Date.now()

    console.log(`执行100000 for循环打印消耗的时间:${endTime - starTime}`)

Date.parse方法

Date.parse(str) 方法可以从一个字符串中读取日期,并且输出对应的Unix时间戳。

Date.parse(str) :

- 作用等同于 new Date(dateString).getTime() 操作;
- 需要符合 RFC2822 或 ISO 8601 日期格式的字符串;
	- 比如YYYY-MM-DDTHH:mm:ss.sssZ

其他格式也许也支持,但结果不能保证一定正常;

如果输入的格式不能被解析,那么会返回NaN;

	var timeString = '2033-03-24'

    // 1.方式一
    /* var date = new Date(timeString)
    var timestamp = date.getTime() */

    // 2.方式二
    var timestamp = Date.parse(timeString)
    
    console.log(timestamp)

时间格式化的方法

Q.E.D.