目前我正在处理运输条件。在这个我会得到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();
}
答案 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 );
您可以使用isEqual
,isBefore
和isAfter
方法进行比较。
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
同样如此。