Java 根据另一时区的给定时间检查本地时间

Java 根据另一时区的给定时间检查本地时间,java,time,java-8,java-time,Java,Time,Java 8,Java Time,我在检查本地系统时间与另一时区给定时间的逻辑方面遇到了问题。基本上,我所需要做的就是在联系人列表中获取预定通话时间和特定时区,并检查系统时间(始终为中心时间)是否等于或晚于给定时区中的预定通话时间 因此,时间戳的格式是06-03-2020 19:00:10,也会有一个时区,例如,Canada/Newfoundland。我觉得这应该是一个直截了当的问题,但我有困难让它工作。以下是目前的方法: private boolean restrictTimeCheck1(String schedCallTi

我在检查本地系统时间与另一时区给定时间的逻辑方面遇到了问题。基本上,我所需要做的就是在联系人列表中获取预定通话时间和特定时区,并检查系统时间(始终为中心时间)是否等于或晚于给定时区中的预定通话时间

因此,时间戳的格式是
06-03-2020 19:00:10
,也会有一个时区,例如,
Canada/Newfoundland
。我觉得这应该是一个直截了当的问题,但我有困难让它工作。以下是目前的方法:

private boolean restrictTimeCheck1(String schedCallTime, String tz) throws Exception {
        System.out.println(String.valueOf(Util.ts()) + ">>> Entering restrictTimeCheck1");
        boolean canCall = false;
        Date now = new Date();
        LocalDateTime ldt = LocalDateTime.ofInstant(now.toInstant(), ZoneId.systemDefault());
        SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss");
        Date schedDate = sdf.parse(schedCallTime );
        LocalDateTime schedTime = LocalDateTime.ofInstant(schedDate.toInstant(), ZoneId.of(tz));
        ZonedDateTime zonedSchedTime = schedTime.atZone(ZoneId.of(tz));
        if (ldt.isAfter(zonedSchedTime.toLocalDateTime())) {
            canCall = true;
        }
        System.out.println(String.valueOf(Util.ts()) + "<<< Exiting restrictTimeCheck1: " + canCall);
        return canCall;
      }
private boolean restrictTimeCheck1(字符串schedCallTime,字符串tz)引发异常{
System.out.println(String.valueOf(Util.ts())+“>>>输入restrictTimeCheck1”);
布尔canCall=false;
现在日期=新日期();
LocalDateTime ldt=LocalDateTime.ofInstant(现在是.toInstant(),ZoneId.systemDefault());
SimpleDataFormat sdf=新的SimpleDataFormat(“dd-MM-yyy-HH:MM:ss”);
日期schedDate=sdf.parse(schedCallTime);
LocalDateTime schedTime=LocalDateTime.ofInstant(schedDate.toInstant(),ZoneId.of(tz));
ZonedDateTime zonedSchedTime=schedTime.atZone(ZoneId.of(tz));
if(ldt.isAfter(zonedSchedTime.toLocalDateTime()){
canCall=true;
}
System.out.println(String.valueOf(Util.ts())+“它相当简单:

ZonedDateTime scheduledCallTime = LocalDateTime
        .parse("06-03-2020 19:00:10", DateTimeFormatter.ofPattern("dd-MM-uuuu HH:mm:ss"))
        .atZone(ZoneId.of("Canada/Newfoundland"));

ZonedDateTime localSystemTime = ZonedDateTime.now();

System.out.println("Scheduled Call Time: " + scheduledCallTime);
System.out.println("Local System Time: " + localSystemTime);
System.out.println("You're late: " + localSystemTime.isAfter(scheduledCallTime));
输出

预定通话时间:2020-03-06T19:00:10-03:30[加拿大/纽芬兰]
当地系统时间:2020-03-08T15:37:00.836235400-04:00[美国/纽约]
你迟到了:真的
这相当简单:

ZonedDateTime scheduledCallTime = LocalDateTime
        .parse("06-03-2020 19:00:10", DateTimeFormatter.ofPattern("dd-MM-uuuu HH:mm:ss"))
        .atZone(ZoneId.of("Canada/Newfoundland"));

ZonedDateTime localSystemTime = ZonedDateTime.now();

System.out.println("Scheduled Call Time: " + scheduledCallTime);
System.out.println("Local System Time: " + localSystemTime);
System.out.println("You're late: " + localSystemTime.isAfter(scheduledCallTime));
输出

预定通话时间:2020-03-06T19:00:10-03:30[加拿大/纽芬兰]
当地系统时间:2020-03-08T15:37:00.836235400-04:00[美国/纽约]
你迟到了:真的

谢谢!现在可以了,我想我是想得太多了/设计得太多了。谢谢!现在可以了,我想我是想得太多了/设计得太多了。因为你可以使用java.time中的
LocalDateTime
Instant
ZoneId
zonedatetime
,现代的java日期和时间API,我建议d避免将
Date
SimpleDateFormat
混用。第一,这些类的设计很差,而且很早就过时了,后者特别麻烦。第二,使用这两组类只会使事情过于复杂。java.time提供了您想要的所有功能。因为您可以使用
LocalDateTime
Instant
ZoneId
ZoneDateTime
,我建议您避免混用
date
SimpleDateFormat
。首先,这些类设计拙劣且过时很长,后者尤其是出了名的麻烦java.time提供了您想要的所有功能。