计算机系统应用教程网站

网站首页 > 技术文章 正文

Java修炼终极指南:79,80,81 签到终极修炼天赋

btikc 2024-10-29 13:15:06 技术文章 5 ℃ 0 评论

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());


完成!

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表