电脑@如何处理计算机中的日期和时间问题?( 三 )


美国使用夏令时时 , 纽约时间按照西四区计算 , 即:GMT-4 。 这段时间北京时间比纽约时间快 12 个小时 , 夏令时结束后 , 纽约时间又恢复到西五区 GMT-5 。
由于各国规定有所差异 , 所以夏令时计算非常复杂 。 当我们需要计算夏令时时 , 应尽量使用 Java 库提供的类 , 避免自己计算夏令时 。
三、旧 API Java 标准库提供了两套关于时间和日期的 API:

  • 旧 API:位于 java.util 包中 , 里面主要有 Date、Calendar、TimeZone 类
  • 新 API:位于 java.time 包中 , 里面主要有 LocalDateTime、ZonedDateTime、ZoneId 类
有两套 API 的原因是旧 API 在设计时没有考虑好时区问题 , 常量设计也有些不合理 , 导致使用起来不够方便 。 新 API 很好地解决了这些问题 。 我们在开发时 , 除非维护老代码 , 其他时候都应该尽量使用新 API 。
3.1. DateDate 类用于存储日期和时间 , 查看其源码可以发现 , 它保存了一个 long 类型的时间戳 。 时间戳是指格林威治时间从 1970 年 1 月 1 日零点到此刻经历的秒数或毫秒数 。

电脑@如何处理计算机中的日期和时间问题?
本文插图
Date 的基本用法如下:
电脑@如何处理计算机中的日期和时间问题?
本文插图
Date 在使用时有几个缺点:
  • 每次获取年份、月份都需要转换
  • 只能获取当前时区的时间 , 无法设置时区
  • 无法加减日期和时间
  • 无法计算某个月的第几个星期几

3.2. SimpleDateFormat 默认输出的时间字符串的格式通常不能满足我们的要求 , 所以我们需要用 SimpleDateFormat 来格式化输出 , 它使用一些预定义的字符串表示格式化 , 较常用的字符串有:
  • y:年
  • M:月
  • d:日
  • H:小时
  • m:分钟
  • s:秒
  • S:毫秒
  • a:上午 / 下午
  • E:星期
  • z:时区
附:Java 官网文档中给出的预定义字符串表格
电脑@如何处理计算机中的日期和时间问题?
本文插图
SimpleDateFormat 的使用:
电脑@如何处理计算机中的日期和时间问题?
本文插图
这里的时区信息输出为 CST , 表示 China Standard Time , 也就是中国标准时间 。
SimpleDateFormat 会根据预定义字符的长度打印不同长度的信息 。 以 M 为例:
  • M:输出 2
  • MM:输出 02
  • MMM:输出 2月
  • MMMM:输出 二月
如果预定义字符串的长度短于需要输出的信息 , 这时 Java 会输出 能包含全部信息的最短字符串 , 也就是说 Java 不会丢弃任何信息 , 如上例中只用了一个 y , 仍然输出了 2020 , 并不会只输出一个 2 。
我们来发挥一下极客精神 , 探索一下预定义字符串过长 Java 会怎么处理:
电脑@如何处理计算机中的日期和时间问题?
本文插图
本例中 , 每个预定义字符的长度都为 10 , 可以看到 , 系统对年、日、时、分、秒、毫秒的处理是用前置 0 补足位数 , 对月份、上午 / 下午、星期、时区的处理是输出全中文 。
SimpleDateFormat 可以设置时区 , 我们可以用 SimpleDateFormat 把 Date 获取的时间转换为其他时区显示出来:
电脑@如何处理计算机中的日期和时间问题?
本文插图
3.3. Calendar 旧 API 中 , 为了加减日期和时间 , Java 提供了 Calendar 类 。


推荐阅读