如何将 ZonedDateTime 的时间与另一个 ZonedDateTime 进行比较,但只有时间而不是日期?
How to compare a ZonedDateTime's time with another ZonedDateTime but with only time and not date?
我在本地时间有两个日期。
"2021-09-01 07:00:00 AM"
和 "2021-09-01 08:00:00 AM"
(太平洋标准时间)
我正在尝试检查这两个日期是否介于另一个时区的两个时间 8 am
和 10 pm
之间。 (美国东部标准时间)
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss a");
ZonedDateTime startLocal = LocalDateTime.parse("2021-09-01 07:00:00 AM", formatter).atZone(ZoneId.systemDefault());
ZonedDateTime endLocal = LocalDateTime.parse("2021-09-01 08:00:00 AM", formatter).atZone(ZoneId.systemDefault());
ZonedDateTime startEst = startLocal.withZoneSameInstant(ZoneId.of("America/New_York"));
ZonedDateTime endEst = endLocal.withZoneSameInstant(ZoneId.of("America/New_York"));
System.out.println("Start Est: " + startEst.format(formatter)); //Start Est: 2021-09-01 10:00:00 AM
System.out.println("End Est: " + endEst.format(formatter)); //End Est: 2021-09-01 11:00:00 AM
我不知道如何比较起始时区 startEst
和 endEst
与两次 8 am
和 10 pm
而不使用date
而且只用时间。
我又添加了两个ZonedDateTimes
来比较
ZonedDateTime buisnessStartHoursInEst8am = //Unsure of what to use here
ZonedDateTime buisnessEndHoursInEst10pm = //Unsure of what to use here
if(startEst.isBefore(buisnessStartHoursInEst8am)){
System.out.println("Business has not opened yet");
}
if(endEst.isAfter(buisnessEndHoursInEst10pm)){
System.out.println("Business has already closed");
}
你说:
I have two dates in my Local Time time.
"2021-09-01 07:00:00 AM" and "2021-09-01 08:00:00 AM" (PST)
第一句话好像是误会。一个 LocalTime
object 只包含一个 time-of-day,没有日期。也许您的意思是 LocalDateTime
,它包含日期和 time-of-day,但缺少时区或 offset-from-UTC.
的上下文
虽然你的问题 body 不清楚,但让我们来谈谈你标题的细节:
How to compare a ZonedDateTime's time with another ZonedDateTime but with only time and not date?
要仅通过 time-of-day 与 ZonedDateTime
objects 进行比较,忽略日期和时区,只需提取 LocalTime
objects .
ZonedDateTime edmonton = ZonedDateTime.now( ZoneId.of( "America/Edmonton" ) ) ;
ZonedDateTime tunis = ZonedDateTime.now( ZoneId.of( "Africa/Tunis" ) ) ;
LocalTime edmontonTime = edmonton.toLocalTime() ;
LocalTime tunisTime = tunis.toLocalTime() ;
boolean isEdmontonEarlierThanTunis = edmontonTime.isBefore( tunisTime ) ;
看到这个code run live at IdeOne.com。
2021-09-01T15:13:55.380552-06:00[America/Edmonton]
2021-09-01T22:13:55.384061+01:00[Africa/Tunis]
isEdmontonEarlierTimeThanTunis: true edmontonTime: 15:13:55.380552 tunisTime: 22:13:55.384061
你的代码有很多问题。
- 您应该将字符串解析为
LocalDateTime
,因为它们没有时区。
- 将它们转换为
ZonedDateTime
,您没有正确完成。您应该使用 LocalDateTime#atZone
来这样做。
最后将得到的ZonedDateTime
转换成美国东部时间的ZonedDateTime
进行比较。要获得 buisnessStartHoursInEst8am
和 buisnessEndHoursInEst10pm
,请使用 ZonedDateTime#withHours
.
按如下操作:
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Locale;
public class Main {
public static void main(String[] args) {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss a", Locale.ENGLISH);
LocalDateTime startLocal = LocalDateTime.parse("2021-09-01 07:00:00 AM", formatter);
LocalDateTime endLocal = LocalDateTime.parse("2021-09-01 08:00:00 AM", formatter);
ZoneId zoneLA = ZoneId.of("America/Los_Angeles");
ZoneId zoneNY = ZoneId.of("America/New_York");
ZonedDateTime startZdtPst = startLocal.atZone(zoneLA);
ZonedDateTime endZdtPst = endLocal.atZone(zoneLA);
ZonedDateTime startZdtEst = startZdtPst.withZoneSameInstant(zoneNY);
ZonedDateTime endZdtEst = endZdtPst.withZoneSameInstant(zoneNY);
ZonedDateTime buisnessStartHoursInEst8am = ZonedDateTime.now(zoneNY).withHour(8);
ZonedDateTime buisnessEndHoursInEst10pm = ZonedDateTime.now(zoneNY).withHour(22);
// Compare
if (startZdtEst.isBefore(buisnessStartHoursInEst8am)) {
System.out.println("Business has not opened yet");
}
if (endZdtEst.isAfter(buisnessEndHoursInEst10pm)) {
System.out.println("Business has already closed");
}
}
}
详细了解 modern Date-Time API* from Trail: Date Time。
你的代码很含糊,但我会尝试给你一个例子,说明除了只打印时间之外,我如何检查不同区域的同一时间的差异
创建两个区域 id
创建 LocalDateTime
创建需要区域和 LocalDateTime 的 ZoneDateTime。
之后只需调用 withZoneSameInstant 并选择其他区域,
在这里它将打印完整的 LocalDateTime 再次调用 toLocalTime 以仅获取时间
ZoneId nYork = ZoneId.of("America/New_York");
ZoneId tokyo = ZoneId.of("Asia/Tokyo");
LocalDateTime randomLDT = LocalDateTime.of(2021, 9, 22, 07, 00);
ZonedDateTime selectFirstZone = ZonedDateTime.of(randomLDT, nYork);
System.out.println(selectFirstZone.withZoneSameInstant(tokyo).toLocalTime());
我在本地时间有两个日期。
"2021-09-01 07:00:00 AM"
和 "2021-09-01 08:00:00 AM"
(太平洋标准时间)
我正在尝试检查这两个日期是否介于另一个时区的两个时间 8 am
和 10 pm
之间。 (美国东部标准时间)
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss a");
ZonedDateTime startLocal = LocalDateTime.parse("2021-09-01 07:00:00 AM", formatter).atZone(ZoneId.systemDefault());
ZonedDateTime endLocal = LocalDateTime.parse("2021-09-01 08:00:00 AM", formatter).atZone(ZoneId.systemDefault());
ZonedDateTime startEst = startLocal.withZoneSameInstant(ZoneId.of("America/New_York"));
ZonedDateTime endEst = endLocal.withZoneSameInstant(ZoneId.of("America/New_York"));
System.out.println("Start Est: " + startEst.format(formatter)); //Start Est: 2021-09-01 10:00:00 AM
System.out.println("End Est: " + endEst.format(formatter)); //End Est: 2021-09-01 11:00:00 AM
我不知道如何比较起始时区 startEst
和 endEst
与两次 8 am
和 10 pm
而不使用date
而且只用时间。
我又添加了两个ZonedDateTimes
来比较
ZonedDateTime buisnessStartHoursInEst8am = //Unsure of what to use here
ZonedDateTime buisnessEndHoursInEst10pm = //Unsure of what to use here
if(startEst.isBefore(buisnessStartHoursInEst8am)){
System.out.println("Business has not opened yet");
}
if(endEst.isAfter(buisnessEndHoursInEst10pm)){
System.out.println("Business has already closed");
}
你说:
I have two dates in my Local Time time.
"2021-09-01 07:00:00 AM" and "2021-09-01 08:00:00 AM" (PST)
第一句话好像是误会。一个 LocalTime
object 只包含一个 time-of-day,没有日期。也许您的意思是 LocalDateTime
,它包含日期和 time-of-day,但缺少时区或 offset-from-UTC.
虽然你的问题 body 不清楚,但让我们来谈谈你标题的细节:
How to compare a ZonedDateTime's time with another ZonedDateTime but with only time and not date?
要仅通过 time-of-day 与 ZonedDateTime
objects 进行比较,忽略日期和时区,只需提取 LocalTime
objects .
ZonedDateTime edmonton = ZonedDateTime.now( ZoneId.of( "America/Edmonton" ) ) ;
ZonedDateTime tunis = ZonedDateTime.now( ZoneId.of( "Africa/Tunis" ) ) ;
LocalTime edmontonTime = edmonton.toLocalTime() ;
LocalTime tunisTime = tunis.toLocalTime() ;
boolean isEdmontonEarlierThanTunis = edmontonTime.isBefore( tunisTime ) ;
看到这个code run live at IdeOne.com。
2021-09-01T15:13:55.380552-06:00[America/Edmonton]
2021-09-01T22:13:55.384061+01:00[Africa/Tunis]
isEdmontonEarlierTimeThanTunis: true edmontonTime: 15:13:55.380552 tunisTime: 22:13:55.384061
你的代码有很多问题。
- 您应该将字符串解析为
LocalDateTime
,因为它们没有时区。 - 将它们转换为
ZonedDateTime
,您没有正确完成。您应该使用LocalDateTime#atZone
来这样做。
最后将得到的ZonedDateTime
转换成美国东部时间的ZonedDateTime
进行比较。要获得 buisnessStartHoursInEst8am
和 buisnessEndHoursInEst10pm
,请使用 ZonedDateTime#withHours
.
按如下操作:
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Locale;
public class Main {
public static void main(String[] args) {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss a", Locale.ENGLISH);
LocalDateTime startLocal = LocalDateTime.parse("2021-09-01 07:00:00 AM", formatter);
LocalDateTime endLocal = LocalDateTime.parse("2021-09-01 08:00:00 AM", formatter);
ZoneId zoneLA = ZoneId.of("America/Los_Angeles");
ZoneId zoneNY = ZoneId.of("America/New_York");
ZonedDateTime startZdtPst = startLocal.atZone(zoneLA);
ZonedDateTime endZdtPst = endLocal.atZone(zoneLA);
ZonedDateTime startZdtEst = startZdtPst.withZoneSameInstant(zoneNY);
ZonedDateTime endZdtEst = endZdtPst.withZoneSameInstant(zoneNY);
ZonedDateTime buisnessStartHoursInEst8am = ZonedDateTime.now(zoneNY).withHour(8);
ZonedDateTime buisnessEndHoursInEst10pm = ZonedDateTime.now(zoneNY).withHour(22);
// Compare
if (startZdtEst.isBefore(buisnessStartHoursInEst8am)) {
System.out.println("Business has not opened yet");
}
if (endZdtEst.isAfter(buisnessEndHoursInEst10pm)) {
System.out.println("Business has already closed");
}
}
}
详细了解 modern Date-Time API* from Trail: Date Time。
你的代码很含糊,但我会尝试给你一个例子,说明除了只打印时间之外,我如何检查不同区域的同一时间的差异
创建两个区域 id
创建 LocalDateTime
创建需要区域和 LocalDateTime 的 ZoneDateTime。 之后只需调用 withZoneSameInstant 并选择其他区域,
在这里它将打印完整的 LocalDateTime 再次调用 toLocalTime 以仅获取时间
ZoneId nYork = ZoneId.of("America/New_York");
ZoneId tokyo = ZoneId.of("Asia/Tokyo");
LocalDateTime randomLDT = LocalDateTime.of(2021, 9, 22, 07, 00);
ZonedDateTime selectFirstZone = ZonedDateTime.of(randomLDT, nYork);
System.out.println(selectFirstZone.withZoneSameInstant(tokyo).toLocalTime());