如何检查当前时间实例之前或之后的截止时间?

时间:2016-05-30 09:43:05

标签: datetime java-8 datetime-format

目前我正在处理运输条件。在这个我会得到cut off time反对公司像(05.00 PM)。 现在我想将上述时间与当前时间进行比较,无论是在cut off time之前还是在cut off time之后? 我已经浏览了所有链接,我只能看到date的示例。我随时间找不到任何东西。 请让我知道或提供一些线索,以便我整理出来。

这是我到目前为止所尝试的内容

String todayDate=LocalDate.now().toString("dd.MM.yyyy");

String s=todayDate+cutOffTime;//cutOffTime will get from DB
SimpleDateFormat simpleDateFormat=new SimpleDateFormat("dd.MM.yyyy HH:mm a");
LocalDate despatchDate=LocalDate.now();
try {
    Date cutoffDate=simpleDateFormat.parse(s);
    if (cutoffDate.after(Calendar.getInstance().getTime())){
        despatchDate.plusDays(1);
    }

} catch (ParseException e) {
    e.printStackTrace();
}

2 个答案:

答案 0 :(得分:2)

Java 8日期/时间api

LocalDateTime currentDateTime = LocalDateTime.now();
LocalDate currentDate = LocalDate.now();
String cutOff = "05:00 AM";
DateTimeFormatter timeParser = DateTimeFormatter.ofPattern("hh:mm a");
LocalTime cutOffTime = timeParser.parse(cutOff, LocalTime::from);
LocalDateTime cutOffDateTime = LocalDateTime.of(currentDate, cutOffTime);
//After
cutOffDateTime.isAfter(currentDateTime);
//Before
cutOffDateTime.isBefore(currentDateTime);
//Compare
cutOffDateTime.compareTo(currentDateTime);

答案 1 :(得分:1)

时区

Answer by Shiv V正朝着正确的方向前进,但不是正确的。答案忽略了time zone的关键问题。 Local…类型故意丢失并忽略时区信息,这是他们的目的。但我们很少想丢失时区信息。

确定日期和时间取决于时区。对于任何特定时刻,日期和时间可能在全球范围内变化。巴黎午夜过后几分钟是新的一天,而蒙特利尔仍然是“昨天”。

Instant课程在UTC的时间轴上定义了一个时刻,其分辨率为nanoseconds

Instant now = Instant.now();

如果所需截止日期为“明天下午5点”,则必须将时区指定为上下文。将ZoneId应用于Instant即可获得ZonedDateTime

ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );
ZonedDateTime zdtTomorrow = zdt.plusDays( 1 );

现在调整到下午5点。

LocalTime timeOfDayWhenDue = LocalTime.of( 5 , 0 );
ZonedDateTime zdtDeadline = zdtTomorrow.with( timeOfDayWhenDue );

您可以使用isEqualisBeforeisAfter方法进行比较。

ZonedDateTime now = ZonedDateTime.now( zoneId );
boolean overdue = now.isAfter( zdtDeadline );

您还可以将分区日期时间转换回UTC。 ZonedDateTime个对象及其各自的Instant个对象代表时间轴上的同时时刻(历史记录中的同一时刻),但从不同时区的视点(America/Montreal与{{1 }})。

UTC

如果您想将截止日期告知印度的客户,请调整到另一个时区。日期时间值将代表时间轴上的相同时刻,但会显示对该客户有意义的wall-clock time

Instant instantDeadline = zdtDeadline.toInstant();
Instant instantNow = now.toInstant();
boolean overdue = instantNow.isAfter( instantDeadline );

如果未指定时区,则会以静默方式隐式应用JVM的当前默认时区。不好。首先,隐含的假设会使您的代码易于误解,并使错误更难以查明。更糟糕的是,默认值可以随时更改,部署到其他计算机时,甚至在应用程序执行的任何时刻运行时!最好始终指定所需/预期的时区。顺便说一下,Locale同样如此。