一、日期和时间的概念
(一)日期
2018-09-19
2018-1-1
(二)时间
1 . 不带有日期的时间:
12:56:32
2 . 带有日期的时间:
2018-09-19 12:56:32
- 带有日期的时间,可以表示时刻(Instant)
(三)时区
1 . 时区的概念
当我们在描述当前的时间:2018-09-19 13:00:00时,实际上是指本地时间,如果目前我们处于中国境内,这个本地时间便是指北京时间。
在不同时区在同一时刻,他们的本地时间是不同的。
全球共有24个时区划分,我们将英国伦敦所属时区称为标准时区,其他时区按照地理位置东西偏移程度,以小时为单位进行划分。
北京时间所在时区为东八区(GMT+08:00)。
2 . 时区的表示方式
(1)GMT:标准时区+时区偏移量
(2)UTC:标准时区+时区偏移量
- GMT与UTC是基本等价的,区别在于UTC使用更精确的原子钟进行计时,每个一段时间会进行精确调整
- 在程序开发的过程中可以忽略GMT与UTC之间的误差,计算机时钟在连接网络时会自动通过服务器进行同步
(3)CST:
- 中国标准时间(China Standard Time)
- 美国中部时间(Central Standard Time USA)
(4)国家/城市:例如:Asia/Shanghai
- 这里的城市并不是任意一个城市,而是由国际标准组织规定认证的城市
3 . 夏令时
夏令时(DST:Daylight Saving Time)是指在夏季开始时,将时间向后调整1小时。在夏季结束之后,再将时间向前调整1小时。
中国的夏令时开始于1986年,于1992年中止。
世界各国的夏令时均有不同调整规则。
由于存在夏令时,同一地区用GMT/UTC和城市表示的时区可能导致时间不同
时间 | 2017-11-20 | 2018-06-20 |
---|---|---|
GMT-05:00 | 19:00 | 19:00 |
UTC-05:00 | 19:00 | 19:00 |
America/NewYork | 19:00 | 20:00 |
4 . 地区
地区Locale表示一个国家或地区的日期、时间、数字、货币等格式
- zh_CN表示中国的Locale:2018-09-19
- en_US表示美国的Locale:09/19/2018
在计算机中,使用Locale在日期、时间、货币和字符串之间进行转换:
Locale | 中国消费者 | 美国消费者 |
---|---|---|
商品价格 | 2698.00 | 2,698.00 |
购买日期 | 2018-09-19 | 09/19/2018 |
在编程过程中需要理解Locale用来针对当地用户习惯格式化日期、时间、数字、货币等。
二、Date和Calendar
(一)Date
1 . 数据的存储和展示
存储方式:数据的存储方式指示数据在计算机内存中的保存方式
展示方式:在代码中打印输出的十六进制、十进制、货币形式
//存储方式:
int n = 123400;
//展示方式:
System.out.println(n);//"123400"
printHex(n);//"0xle208"
format(n);//"$123,400"
所以,使用字符串和时区表示的日期和时间实际上就是日期和时间的展示方式
2 . 如何存储日期和时间
(1)在计算机中,使用Epoch Time来存储日期和时间。
(2)Epoch Time:从1970年1月1日零点整(格林威治时区/GMT+00:00)到目前时刻所经历的秒数。
例如:
- 北京时间 2016-11-20 08:15:01 = 1476900901
- 伦敦时间 2016-11-20 00:15:01 = 1476900901
使用毫秒数表示: - 北京时间 2016-11-20 08:15:01.123 = 1476900901123
使用浮点数表示: - 北京时间 2016-11-20 08:15:01.123 = 1476900901.123
(3)当使用Epoch Time来存储时间时,实际上存储的是一个整数。
- 对于Epoch=1476900901,全球各地任何一个时区,其当地时间都可以被唯一的确定。
(4)在Java中,使用long类型的整型来表示毫秒数。
- Epoch Time
- Timestamp(时间戳)
3 . JDK API
Java的JDK中拥有两套处理时间和日期的API:
(1)java.util
- Date
- Calendar
- …
(2)java.time(JDK >= 1.8)
- LocalDate
- LocalTime
- ZonedDateTime
- Instant
- …
4 . java.util.Date
java.util.Date表示当前日期和时间
(1)获取时间
import java.util.Date;
Date now = new Date();//获取当前时间
System.out.println(now);//Mon Nov 14 19:35:24 CST 2016
- 使用new Date()获取当前时间
- 使用long getTime()获取epoch表示的当前时间戳
(2)java.util.Date转化为String
- toString():使用默认格式来转换Date
- toGMTString():使用默认格式来转换Date
- toLocaleString():使用默认格式来转换Date
- SimpleDateFormat:用于Date和String的解析和格式化
import java.util.Date;
Date new = new Date();
System.out.println(now.toString());
System.out.println(now.toGMTString());
System.out.println(now.toLocaleString());
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String s = sdf.format(now);
System.out.println(s);
把String解析为java.util.Date
- SimpleDateFormat
- 用预定义字符串表示格式化的内容
- yyyy:年份
- MM:月份