提交 dcff8733 编写于 作者: W wizardforcel

2021-04-18 16:25:50

上级 3ea3ee6f
......@@ -216,11 +216,11 @@ String zonedDateTimeAsFormattedString
# 59 格式化日期和时间
前面的问题包含一些通过`SimpleDateFormat.format()``DateTimeFormatter.format()`格式化日期和时间的风格。为了定义*格式模式,*开发人员必须了解格式模式语法。换句话说,开发人员必须知道 Java 日期时间 API 使用的一组符号,以便识别有效的格式模式。
前面的问题包含一些通过`SimpleDateFormat.format()``DateTimeFormatter.format()`格式化日期和时间的风格。为了定义*格式模式*开发人员必须了解格式模式语法。换句话说,开发人员必须知道 Java 日期时间 API 使用的一组符号,以便识别有效的格式模式。
大多数符号与`SimpleDateFormat`(JDK 8 之前)和`DateTimeFormatter`(从 JDK 8 开始)通用。下表列出了 JDK 文档中提供的最常见符号的完整列表:
| **字母** | **表示** | **演示** | **例** |
| **字母** | **表示** | **演示** | **例** |
| y | 年 | 年 | 1994; 94 |
| 米 | 每年的月份 | 编号/文本 | 7、 7 月 7 日 |
| W 型 | 每月的一周 | 数 | 4 |
......@@ -236,7 +236,7 @@ String zonedDateTimeAsFormattedString
下表提供了一些格式模式示例:
| **图案** | **例** |
| **图案** | **例** |
| 每天 | 2019-02-24 |
| 年月日 | 02-24-2019 |
| 年月日 | 2019 年 2 月 24 日 |
......@@ -694,7 +694,7 @@ Duration durationBetweenLT
从一个时间单位转换到另一个时间单位可能会产生残余。例如,从秒转换为分钟可能导致秒的剩余(例如,65 秒是 1 分钟,5 秒是剩余)。残差可以通过以下一组方法获得:天残差通过`toDaysPart()`,小时残差通过`toHoursPart()`,分钟残差通过`toMinutesPart()`等等。
假设差异应该显示为天:小时:分:秒:nano(例如,9d:2h:15m:20s:230n)。将`to*Foo()*``to*Foo*Part()`方法的力结合在一个 helper 方法中将产生以下代码:
假设差异应该显示为天:小时:分:秒:nano(例如,9d:2h:15m:20s:230n)。将`toFoo()``toFooPart()`方法的力结合在一个 helper 方法中将产生以下代码:
```java
public static String durationToDHMSN(Duration duration) {
......@@ -749,13 +749,13 @@ System.out.println(d1 + "+" + d2 + "=" + d1d2); // PT2H20M
对于`Date`对象,解决方案可能依赖于`Calendar`实例。绑定到本书的代码包含此解决方案。
对于 jdk8 类,Java 提供了专用的`get*Foo*()`方法和`get​(TemporalField field)`方法。例如,假设下面的`LocalDateTime`对象:
对于 jdk8 类,Java 提供了专用的`getFoo()`方法和`get​(TemporalField field)`方法。例如,假设下面的`LocalDateTime`对象:
```java
LocalDateTime ldt = LocalDateTime.now();
```
依靠`get*Foo*()`方法,我们得到如下代码:
依靠`getFoo()`方法,我们得到如下代码:
```java
int year = ldt.getYear();
......@@ -799,7 +799,7 @@ Year: 2019 Month: 2 Day: 25 Hour: 12 Minute: 58 Second: 13 Nano: 109389100
# 使用 LocalDateTime
跳转到 jdk8,重点是`LocalDate``LocalTime``LocalDateTime``Instant`等等。新的 Java date-time API 提供了专门用于加减时间量的方法。`LocalDate``LocalTime``LocalDateTime``ZonedDateTime``OffsetDateTime``Instant``Period``Duration`以及许多其他方法,如`plus*Foo*()``minus*Foo*()`,其中*、`Foo`*可以用单位替换时间(例如,`plusYears()``plusMinutes()``minusHours()``minusSeconds()`等等)。
跳转到 jdk8,重点是`LocalDate``LocalTime``LocalDateTime``Instant`等等。新的 Java date-time API 提供了专门用于加减时间量的方法。`LocalDate``LocalTime``LocalDateTime``ZonedDateTime``OffsetDateTime``Instant``Period``Duration`以及许多其他方法,如`plusFoo()``minusFoo()`,其中`Foo`可以用单位替换时间(例如,`plusYears()``plusMinutes()``minusHours()``minusSeconds()`等等)。
假设如下`LocalDateTime`
......@@ -872,14 +872,14 @@ Set<String> zoneIds = ZoneId.getAvailableZoneIds();
在第二步,每个时区 ID 都应该用来创建一个`ZoneId`实例。这可以通过`ZoneId.of(String zoneId)`方法实现:
```java
ZoneId zoneid = ZoneId.of(*current_zone_Id*);
ZoneId zoneid = ZoneId.of(current_zone_Id);
```
在第三步,每个`ZoneId`可用于获得特定于所识别区域的时间。这意味着需要一个“实验室老鼠”参考日期时间。此参考日期时间(无时区,`LocalDateTime.now()`)通过`LocalDateTime.atZone()`与给定时区(`ZoneId`)组合,以获得`ZoneDateTime`(可识别时区的日期时间):
```java
LocalDateTime now = LocalDateTime.now();
ZonedDateTime zdt = now.atZone(ZoneId.of(*zone_id_instance*));
ZonedDateTime zdt = now.atZone(ZoneId.of(zone_id_instance));
```
`atZone()`方法尽可能地匹配日期时间,同时考虑时区规则,例如夏令时。
......@@ -1228,7 +1228,7 @@ LocalDate nextSaturday = date.with(nsa);
# JDK 8 之前
在 JDK 8 之前,可以通过`java.util.TimeZone`定义一个时区,有了这个时区,代码就可以通过`TimeZone.getRawOffset()`方法得到时区偏移量(由于这个方法不考虑夏令时,*原始*部分)。绑定到本书的代码包含此解决方案。
在 JDK 8 之前,可以通过`java.util.TimeZone`定义一个时区,有了这个时区,代码就可以通过`TimeZone.getRawOffset()`方法得到时区偏移量(*原始*部分来源于这个方法不考虑夏令时)。绑定到本书的代码包含此解决方案。
# 从 JDK 8 开始
......@@ -1356,7 +1356,7 @@ public static LocalDate dateToLocalDate(Date date) {
}
```
`LocalDate``Date`的转换应该考虑到`LocalDate`不包含`Date`这样的时间成分,所以解决方案必须提供一个时间成分作为一天的开始(关于这个问题的更多细节可以在 S*一天的开始和结束*问题中找到):
`LocalDate``Date`的转换应该考虑到`LocalDate`不包含`Date`这样的时间成分,所以解决方案必须提供一个时间成分作为一天的开始(关于这个问题的更多细节可以在“一天的开始和结束”问题中找到):
```java
// e.g., Fri Mar 01 00:00:00 EET 2019
......@@ -1705,7 +1705,7 @@ ZonedDateTime dayEndZdt = zdt.toLocalDate()
# 76 两个日期之间的差异
计算两个日期之间的差值是一项非常常见的任务(例如,请参阅*计算年龄*部分)。让我们看看其他方法的集合,这些方法可以用来获得以毫秒、秒、小时等为单位的两个日期之间的差异。
计算两个日期之间的差值是一项非常常见的任务(例如,请参阅“计算年龄”部分)。让我们看看其他方法的集合,这些方法可以用来获得以毫秒、秒、小时等为单位的两个日期之间的差异。
# JDK 8 之前
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册