龙空技术网

Java修炼终极指南:63. 定义一天的时间段

启辰8 326

前言:

现在朋友们对“当前日期前一天 java”大体比较关切,姐妹们都需要知道一些“当前日期前一天 java”的相关内容。那么小编同时在网摘上汇集了一些有关“当前日期前一天 java””的相关内容,希望同学们能喜欢,你们快快来了解一下吧!

让我们想象一下,我们想通过一条消息向另一个国家(不同时区)的朋友打招呼,例如根据他当地时间的“早上好”,“下午好”等。因此,仅获取AM/PM标志是不够的,因为我们认为一天(24小时)可以由以下时间段表示:

21:00 PM – 6:00 AM - 夜间

6:00 AM – 12:00 AM - 早晨

12:00 AM – 18:00 PM - 下午

18:00 PM – 21:00 PM - 晚上

**在JDK 16之前**

首先,我们需要获取对应于我们朋友时区的时间。为此,我们可以从本地时间开始,本地时间可以是java.util.Date、java.time.LocalTime等。如果我们从java.util.Date开始,那么我们可以通过以下方式获取我们朋友时区的时间:

LocalTime lt = date.toInstant().atZone(zoneId).toLocalTime();

这里,date是new Date(),zoneId是java.time.ZoneId。当然,我们可以将时区ID作为字符串传递,并使用ZoneId.of(String zoneId)方法获取ZoneId实例。如果我们更喜欢从LocalTime.now()开始,那么我们可以通过以下方式获取我们朋友时区的时间:

LocalTime lt = LocalTime.now(zoneId);

接下来,我们可以定义一天的时间段为一组LocalTime,并添加一些条件来确定当前的时间段。以下代码示例说明了这个声明:

public static String toDayPeriod(Date date, ZoneId zoneId) {       LocalTime lt = date.toInstant().atZone(zoneId).toLocalTime();      LocalTime night = LocalTime.of(21, 0, 0);  LocalTime morning = LocalTime.of(6, 0, 0);  LocalTime afternoon = LocalTime.of(12, 0, 0);  LocalTime evening = LocalTime.of(18, 0, 0);  LocalTime almostMidnight = LocalTime.of(23, 59, 59);  LocalTime midnight = LocalTime.of(0, 0, 0);      if((lt.isAfter(night) && lt.isBefore(almostMidnight))    || lt.isAfter(midnight) && (lt.isBefore(morning))) {     return "night";  } else if(lt.isAfter(morning) && lt.isBefore(afternoon)) {     return "morning";  } else if(lt.isAfter(afternoon) && lt.isBefore(evening)) {     return "afternoon";  } else if(lt.isAfter(evening) && lt.isBefore(night)) {     return "evening";  }  return "day";}

**在JDK 16+**

从JDK 16+开始,我们可以通过以下字符串超越AM/PM标志:in the morning, in the afternoon, in the evening, and at night。这些友好的输出可以通过新的模式B获得。这种模式是从JDK 16+开始通过DateTimeFormatter和DateTimeFormatterBuilder(你应该熟悉这些API,来自第1章,问题15)提供的。

因此,以下代码使用DateTimeFormatter来示例模式B的使用,代表一天的时间段:

public static String toDayPeriod(Date date, ZoneId zoneId) {  ZonedDateTime zdt = date.toInstant().atZone(zoneId);  DateTimeFormatter formatter    = DateTimeFormatter.ofPattern("yyyy-MMM-dd [B]");  return zdt.withZoneSameInstant(zoneId).format(formatter);}

这是澳大利亚/墨尔本的输出示例:

2023-Feb-04 at night

你可以在打包的代码中看到更多的示例。请随意挑战自己,调整此代码以重现第一个示例的结果。

标签: #当前日期前一天 java