- 时间和日期是什么?
- 时间线原点
- UTC和GMT
- 夏令时
- 获取距1970-1-1,00:00:00的毫秒
- 获取当前时间或日期
- 同时获取时间和日期
- 只获取日期
- 只获取时间
- 加上时区
- ZoneId
- TimeZone
- 格式化和解析
- SimpleDateFormat
- DateTimeFormatter
- 其他
在java中用于操作时间的类有:
- java.sql.Time (java.util.Date的子类,用于SQL)
- java.sql.Timestamp(java.util.Date的子类,用于SQL)
- java.security.Timestamp(用于并发)
- java.time.LocalTime(JDK1.8)
在java中用于操作日期的类有:
- java.sql.Date(java.util.Date的子类,用于SQL)
- java.time.LocalDate(JDK1.8)
可同时操作时间日期的类有
- java.util.Date(JDK1.0,已废弃)
- java.util.Calendar(JDK1.1)
- java.time.Instant(JDK1.8)
- java.time.LocalDateTime (JDK1.8)
- java.time.ZonedDateTime(JDK1.8)
用于转换时间日期的类:
- java.time.format.DateTimeFormatter(JDK1.8)
- java.text.DateFormat
- java.text.SimpleDateFormat(java.text.DateFormat的子类)
下面的Date都是 java.util包下的,暂不介绍java.sql
时间线原点时间线原点以伦敦格林威治皇家天文台的本初子午线所处时区的1970-1-1,00:00:00为准,每天为86400秒
UTC和GMT- GMT(Greenwish Mean Time)根据地球的自转和公转来计算时间,是格林威治的时区时间。
- UTC(Coordinated Universal Time) 根据原子钟来计算时间,是标准时间,不与任何地区位置相关,也不代表此刻某地的时间,所以在说明某地时间时要加上时区
- GMT = UTC + 0
夏令时(Daylight Saving Time:DST),指在天亮早的夏季人为将时间调快一小时(因为夏季太阳早升晚落,调快一小时可让人们早睡早起,节约电量,下面举例)
- 假如夏天6点日出,7点日落
- 平常人们9点起床,6点下班,7点开灯,11点关灯睡觉,开灯4小时
- 调快一小时后人们实际8点起床,5点下班,还是7点开灯(因为日落),但是睡觉变成了10点,开灯3小时
各个国家具体规定不同,有近110个国家每年要实行夏令时,如我国曾在1986年-1991年执行过夏令时
- 每年从四月中旬第一个星期日的凌晨2时整,将时钟拨快一小时,即将表针由2时拨至3时,夏令时开始;
- 到九月中旬第一个星期日的凌晨2时整,再将时钟拨慢一小时,即将表针由2时拨至1时,夏令时结束。
- 从1986年到1991年的六个年度,除1986年因是实行夏时制的第一年,从5月4日开始到9月14日结束外,其它年份均按规定的时段施行。
下面打印如1638844316226,毫秒数通常没什么用
System.out.println(new Date().getTime()); System.out.println(System.currentTimeMillis()); System.out.println(Instant.now().toEpochMilli());获取当前时间或日期
若未加上时区,则默认为距1970-1-1,00:00:00的GMT绝对时间
同时获取时间和日期Date和Calendar打印如Tue Dec 07 02:46:14 GMT 2021
System.out.println(new Date()); System.out.println(new Date(System.currentTimeMillis())); System.out.println(Calendar.getInstance().getTime());
Instant打印如2021-12-01T07:36:42.350Z,T表示分割,Z表示当前是UTC0,可为±
System.out.println(Instant.now());
LocalDateTime是不带时区的本地时间,如下打印2021-12-07T06:27:58.506
System.out.println(LocalDateTime.now());
ZonedDateTime是带时区的时间,如下打印2021-12-07T06:27:58.506Z[GMT],
System.out.println(ZonedDateTime.now());只获取日期
LocalDate相当于截取了LocalDateTime中T的前半部分,如下打印2021-12-07
System.out.println(LocalDate.now());只获取时间
LocalTime相当于截取了LocalDateTime的T到Z的后半部分,如下打印06:27:58.506
System.out.println(LocalTime.now());加上时区 ZoneId
用于LocalTime、LocalDate、LocalDateTime、ZonedDateTime,可通过ZoneId.getAvailableZoneIds()获取全部ID,如America/New_York
SetavailableZoneIds = ZoneId.getAvailableZoneIds(); for (String availableZoneId : availableZoneIds) { System.out.println(availableZoneId); }
加上时区后,打印如下,可知 New_York = GMT - 5
- 2021-12-07T07:02:07.627Z[GMT]
- 2021-12-07T02:02:07.654-05:00[America/New_York]
System.out.println(ZonedDateTime.now());
System.out.println(ZonedDateTime.now(ZoneId.of("America/New_York")));
TimeZone
用于Calendar,可通过TimeZone.getAvailableIDs()获取全部ID,如America/New_York
String[] availableIDs = TimeZone.getAvailableIDs();
for (String availableID : availableIDs) {
System.out.println(availableID);
}
加上时区后,打印如下,可知 New_York = GMT - 5
- Tue Dec 07 08:24:04 GMT 2021
- Tue Dec 07 03:24:04 EST 2021
System.out.println(Calendar.getInstance().getTime());
TimeZone.setDefault(TimeZone.getTimeZone("America/New_York"));
System.out.println(Calendar.getInstance().getTime());
格式化和解析
默认的时间格式通常不是我们所需要的,可通过定义字符串得到自己想要时间格式
SimpleDateFormat用于Date,HH为24小时制,hh为12小时制(用a表示上下午),如下为转换
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("日期:yyyy年MM月dd日 时间:HH时mm分ss秒 时区偏移:Z");
System.out.println(simpleDateFormat.format(new Date()));
如下为解析
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("日期:yyyy年MM月dd日 时间:HH时mm分ss秒 时区偏移:Z");
String s = "日期:2021年12月07日 时间:08时42分15秒 时区偏移:+0000";
Date parse = null;
try {
parse = simpleDateFormat.parse(s);
} catch (ParseException e) {
e.printStackTrace();
}
System.out.println(parse);
DateTimeFormatter
用于LocalTime、LocalDate、LocalDateTime、ZonedDateTime,如下格式化ZonedDateTime
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("日期:yyyy年MM月dd日 时间:HH时mm分ss秒 时区偏移:Z");
System.out.println(dateTimeFormatter.format(ZonedDateTime.now()));
如下为解析
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("日期:yyyy年MM月dd日 时间:HH时mm分ss秒 时区偏移:Z");
String s = "日期:2021年12月07日 时间:08时42分15秒 时区偏移:+0000";
TemporalAccessor parse = dateTimeFormatter.parse(s);
System.out.println(ZonedDateTime.from(parse));
其他
计算算法所需时间示例
Instant start = Instant.now();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
Instant end = Instant.now();
Duration duration = Duration.between(start, end);
long seconds = duration.getSeconds();
System.out.println(seconds);



