网站首页 > 技术文章 正文
79. 计算月份的中间日期
假设我们有一个`LocalDate`,我们想从它计算出另一个`LocalDate`,代表月份的中间。如果我们知道`LocalDate` API有一个名为`lengthOfMonth()`的方法,这个方法返回一个整数,代表月份的天数长度,那么这可以在几秒钟内完成。所以,我们所要做的就是计算`lengthOfMonth()/2`,如下所示的代码:
public static LocalDate middleOfTheMonth(LocalDate date) {
return LocalDate.of(date.getYear(), date.getMonth(),
date.lengthOfMonth() / 2);
}
在打包的代码中,你可以看到基于`Calendar` API的解决方案。
80. 获取两个日期之间的季度数
这只是另一个需要我们深入掌握Java日期/时间API的问题。这次,我们讨论的是`java.time.temporal.IsoFields`,它在问题x中已经介绍过了。ISO字段之一是`QUARTER_YEARS`,它是一个时间单位,代表一个季度的概念。所以,有了两个`LocalDate`,我们可以这样写:
public static long nrOfQuarters(
LocalDate startDate, LocalDate endDate) {
return IsoFields.QUARTER_YEARS.between(startDate, endDate);
}
请随意挑战自己,为`java.util.Date/Calendar`提供一个解决方案。
81. 将`Calendar`转换为`LocalDateTime`
在问题x中,你看到将`java.util.Date`(date)转换为`LocalTime`可以这样完成:
LocalTime lt = date.toInstant().atZone(zoneId).toLocalTime();
同样的方式,我们可以将`java.util.Date`转换为`LocalDateTime`(这里,zoneId被替换为`ZoneId.systemDefault()`):
LocalDateTime ldt = date.toInstant().atZone(
ZoneId.systemDefault()).toLocalDateTime();
我们也知道,我们可以通过`getTime()`方法从`Calendar`获取一个`java.util.Date`。所以,通过连接这些碎片,我们得到了以下代码:
public static LocalDateTime
toLocalDateTime(Calendar calendar) {
Date date = calendar.getTime();
return date.toInstant().atZone(
ZoneId.systemDefault()).toLocalDateTime();
}
通过更短的路径,可以得到相同的结果,如下所示:
return LocalDateTime.ofInstant(
calendar.toInstant(), ZoneId.systemDefault());
或者,更短,如下所示:
return LocalDateTime.ofInstant(
calendar.toInstant(), ZoneId.systemDefault());
但是,这段代码假设给定的`Calendar`的时区是默认时区。如果日历有一个不同的时区(例如,亚洲/加尔各答),那么我们可能期望返回一个`ZonedDateTime`而不是`LocalDateTime`。这意味着我们应该相应地调整前面的代码:
public static ZonedDateTime
toZonedDateTime(Calendar calendar) {
Date date = calendar.getTime();
return date.toInstant().atZone(
calendar.getTimeZone().toZoneId());
}
同样,一些更短的版本是可用的:
return ZonedDateTime.ofInstant(
Instant.ofEpochMilli(calendar.getTimeInMillis()),
calendar.getTimeZone().toZoneId());
return ZonedDateTime.ofInstant(calendar.toInstant(),
calendar.getTimeZone().toZoneId());
完成!
猜你喜欢
- 2024-10-29 你还在用 Date?快使用 LocalDateTime 了!
- 2024-10-29 硬核!最全的延迟任务实现方式汇总!附代码(强烈推荐)
- 2024-10-29 还在实体类中用Date?JDK8新的日期类型不香么?
- 2024-10-29 LocalDateTime 说:2020,是时候换个更好的日期时间类了
- 2024-10-29 程序员,你还在使用Date嘛?建议你使用LocalDateTime哦
- 2024-10-29 深度思考:在JDK8中,日期类型该如何使用?
- 2024-10-29 为什么建议使用你 LocalDateTime,而不是 Date?
- 2024-10-29 百度开源的分布式唯一ID生成器UidGenerator,解决了时钟回拨问题
- 2024-10-29 DeepLearning4j 实战:手写体数字识别的 GPU 实现与性能对比
- 2024-10-29 老大,你为什么在代码中要求我们使用LocalDateTime而不是Date?
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- oraclesql优化 (66)
- 类的加载机制 (75)
- feignclient (62)
- 一致性hash算法 (71)
- dockfile (66)
- 锁机制 (57)
- javaresponse (60)
- 查看hive版本 (59)
- phpworkerman (57)
- spark算子 (58)
- vue双向绑定的原理 (68)
- springbootget请求 (58)
- docker网络三种模式 (67)
- spring控制反转 (71)
- data:image/jpeg (69)
- base64 (69)
- java分页 (64)
- kibanadocker (60)
- qabstracttablemodel (62)
- java生成pdf文件 (69)
- deletelater (62)
- com.aspose.words (58)
- android.mk (62)
- qopengl (73)
- epoch_millis (61)
本文暂时没有评论,来添加一个吧(●'◡'●)