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


Calendar 的基本使用:
电脑@如何处理计算机中的日期和时间问题?
本文插图
Calendar 修复了 Date 获取年份时必须 + 1900 的问题 , 但月份仍然使用 0~11 表示 1~12 月 , 星期采用 1~7 表示周日~周六 。 虽然咱们程序员都从 0 开始计数 , 但日期和时间一般都是要展示给用户看的 , 每次显示时都要转换实在是太不方便了 , 这也是需要新 API 的原因之一 。
Calendar 提供的日期和时间的加减功能使用如下:
电脑@如何处理计算机中的日期和时间问题?
本文插图
使用日期加减时有一点需要特别注意 , 我们来看一个例子:
电脑@如何处理计算机中的日期和时间问题?
本文插图
我们将 12 月 31 日减去 1 个月 , 再加上 1 个月 , 日期变成了 12 月 30 日!这是因为 11 月 没有 31 日 , 所以 12 月 31 日减去 1 个月时 ,Calendar 会自动将日期调整到 11 月 30 日 , 再加 1 个月 , 就变成了 12 月 30 日 。 也就是说 Calendar 加减时 , 会根据月份自动调整日期 。
上文介绍 Date 时我们说到 , 单靠 Date 和 SimpleDateFormat 只能把本地时区的时间用其他时区显示出来 , 无法自由的实现时区的转换 , 比如我们身在中国 , 无法把纽约时间 GMT-5 转换为东京时间 GMT+9 。 但 Calendar 是可以设置时区的 , 所以我们现在有了一种间接转换任意时区的方法:
电脑@如何处理计算机中的日期和时间问题?
本文插图
【电脑@如何处理计算机中的日期和时间问题?】
实际转换过程为:Calendar 保存的 纽约时间先转换成 Date 保存的 北京时间 , 再用 SimpleDateFormat 将 Date 转换成 东京时间展示出来 。
上例中还可以看到 , Calendar 使用 set 方法设置指定时间 , 除了此例中的一次性全部指定的方式外 , 也可以单个指定:
电脑@如何处理计算机中的日期和时间问题?
本文插图
四、新 API 由于旧 API 存在的诸多不便 , 从 Java 8 开始 , jaca.time 包提供了一套新的日期和时间的 API 。 主要有 LocalDateTime、ZonedDateTime、Instant、ZoneId、Duration、DateTimeFormatter 。
新 API 不仅使用更方便 , 而且修正了 旧 API 中不合理的常量设计:

  • 新 API 中 , Month 取值范围变成:1~12 , 表示 1~12月
  • 新 API 中 , Week 取值范围变成:1~7 , 表示周一~周日
4.1. LocalDateTime LocalDateTime 用来代替 Date 和 Calendar , LocalDateTime 的基本用法如下:
电脑@如何处理计算机中的日期和时间问题?
本文插图
LocalDateTime 使用 now() 函数获取当前日期和时间 , 输出时严格按照 ISO 8601 格式打印 。 ISO 8601 是国际标准化组织的日期和时间的表示方法 , 全称为《数据存储和交换形式·信息交换·日期和时间的表示方法》 , ISO 8601 规定使用 T 分隔日期和时间 。 标准格式如下:
  • 日期:yyyy-MM-dd
  • 时间:HH:mm:ss
  • 带毫秒的时间:HH:mm:ss.SSS
  • 日期和时间:yyyy-MM-dd'T'HH:mm:ss
  • 带毫秒的日期和时间:yyyy-MM-dd'T'HH:mm:ss.SSS
我们可以通过 parse() 函数解析一个符合 ISO 8601 格式的字符串 , 创建出 LocalDateTime:
电脑@如何处理计算机中的日期和时间问题?
本文插图


推荐阅读