基础概念
一、时刻
表示某一个时间点,一般使用 时间戳(比如1686418183) 或者 时间字符串(比如2023-06-11 01:29:43)+时区(比如Asia/Shanghai)来表示。
在各个编程语言中,使用时间对象来表示。
1、时间戳
说明:unix时间戳,是从1970年1月1日(UTC/GMT的午夜)开始所经过的秒数(int64),时间戳可以精确地表示某一时刻。全世界的时间戳都是一样的,并且与时区无关
编程语言获取时间戳:
编程语言 | 指令 |
---|---|
Java | System.currentTimeMillis() / 1000 |
PHP | time() |
Golang | time.now().Unix() |
JavaScript | Math.round(new Date().getTime()/1000) |
MySQL | SELECT unix_timestamp(now()) |
2、时间字符串
人们常用的时间格式:"2020-2-7 02:58:00","2020-2-7", "02:58:00"
时间戳是给电脑程序用的,时间字符串才是给人看的😁
3、时间对象
不同编程语言读取数据库时间后包装类型
编程语言 | 时间对象 |
---|---|
Java | java.util.Date对象,由时间戳构造 |
PHP | 时间字符串 或者 DateTime对象 |
Golang | time.Time对象,由时间戳和Localtion时区构造 |
JavaScript | Date对象 |
数据库时间(常用datetime和timestamp)
- datetime 日期时间,8字节,格式: yyyy-MM-dd HH:mm:ss,存储范围:'1000-01-01 00:00:00' to '9999-12-31 23:59:59'
- timestamp 时间戳,4字节,存储范围:'1970-01-01 00:00:01' UTC to '2038-01-19 03:14:07' UTC
日历
将时间戳转换成年月日时分秒的时间字符串,就需要日历。
二、时区
地球是圆的,全世界的时间戳是一致的,但是时间字符串不一致(比如北京8点的时候日本东京是9点)。这就需要划分不同的时区来区分。
全球共分为24个时区,东西各12个时区。每个时区差1小时。
1、时区表示方法
- 时区名称:一般用"Asia/Shanghai","America/New_York"的方式(洲/城市名)来表示,这是IANA的标准,各个编程语言都会遵循该标准。
- UTC偏移量:utc_offset,是和0时区(也就是UTC:世界协调时)的偏差值,一般用分钟来表示,比如东八区是+480分钟,西三区是-180分钟。
- 地理位置:根据位置可以知道对应的时区,在滴滴用cityId来表示。
2、夏令时
夏令时,(Daylight Saving Time:DST),是一种为节约能源而人为调整时间的制度,一般在天亮早的夏季人为将时间调快一小时,可以使人早起早睡,减少照明量,从而节约照明用电。
一般是在夏天将时间调快1小时,在冬天再将时间调回来。 现在还有很多国家使用夏令时,比如美国、智利。中国也实行过一段时间夏令时,但在1991年后取消了。
这个夏令时切换规则是可以人为调整的,比如巴西在巴西在2019年取消夏令时,埃及在2023年恢复夏令时,智利在2022年夏令时切换时间推迟一周。
夏令时的切换会给程序带来不小的麻烦,如果夏令时规则更新不及时,会让时间错1小时。
时间长度 duration
时间经过的长度,比如30min,5s
时间段(时间范围) interval
比如 8点~11点,10.1日~10.7日
时间三要素
- 时间戳:从1970年1月1日(UTC/GMT的午夜)开始所经过的秒数
- 时间字符串:人们看得懂的时间格式,比如"2020-02-07 02:58:00"
- 时区:用cityId、时区名、utc_offset其中之一即可表示。
精准表示一个时间点,需要使用时间戳 或者 时间字符串+时区来表示。
时间戳是给计算机使用的,时间字符串是给人看的。
有三要素的其中两个,便可以推出另外一个要素。