如何比较Java8中日期对象之间的时间?
给定两个包含小时和分钟的如何比较Java8中日期对象之间的时间?,java,date,Java,Date,给定两个包含小时和分钟的Date对象,我如何优雅地找出其中哪一个是一天中最早的时间 例如,如果date1是2018-01-01在09:00,而date2是2018-01-02在08:00,则根据本规范,date2
Date
对象,我如何优雅地找出其中哪一个是一天中最早的时间
例如,如果date1
是2018-01-01
在09:00
,而date2
是2018-01-02
在08:00
,则根据本规范,date2
编辑2:
//just a sample. base on your case, set the date you have to here.
Date date1 = Calendar.getInstance().getTime();
Date date2 = Calendar.getInstance().getTime();
LocalDateTime lcdate1 = date1.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
LocalDateTime lcdate2 = date2.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
int date1Hour = lcdate1.getHour();
int date1Minute = lcdate1.getMinute();
int date2Hour = lcdate2.getHour();
int date2Minute = lcdate2.getMinute();
详情如下:
希望对您有所帮助。如果您之前转换了
日期
,您可以使用本地时间
的比较方法
像这样转换(位于):
比较如下:
time1.compareTo(time2);
public static int compareTimeOfDates(Date date1, Date date2) {
return convertToLocalTimeViaInstant(date1).compareTo(convertToLocalTimeViaInstant(date2));
}
如果你想使用一种方法,你可以这样使用转换:
time1.compareTo(time2);
public static int compareTimeOfDates(Date date1, Date date2) {
return convertToLocalTimeViaInstant(date1).compareTo(convertToLocalTimeViaInstant(date2));
}
int comparetimeof日期(日期a、日期b){
LocalDateTime localA=a.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
int hourA=localA.getHour();
int minuteA=localA.getMinute();
LocalDateTime localB=date1.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
int hourB=localB.getHour();
int minuteB=localB.getMinute();
if(hourA==hourB&&minuteA==minuteB){
返回0;
}
if(hour1
您可以尝试执行以下操作:
boolean compareTime(Date date1, Date date2) {
DateFormat df = new SimpleDateFormat("HHmm");
int timeDate1 = Integer.valueOf(df.format(date1));
int timeDate2 = Integer.valueOf(df.format(date2));
return timeDate1 >= timeDate2;
}
请尽量避免使用遗留的java.util.Date
类。您应该查看java.time
包,选择最适合您的用例的类。Date
不包含任何小时或分钟。它只包含一个long
值,即自1970年1月1日00:00:00 GMT以来的毫秒数。不幸的是,我使用的API返回一个java.util.Date
,我无法更改它。肯定会有一些转变发生吗?或者一种保持时间的方法,但将两者的年/月/日重置为相同的值,然后在
之前使用?可惜这个问题被否决了,因为很难在网上找到答案。@Salvatoreivine将日期
转换为即时
,将Instant
从UTC调整到时区以获得ZonedDateTime
,从ZonedDateTime
提取LocalTime
,并比较LocalTime
对象,这些都是堆栈溢出中已经讨论过很多次的主题。谢谢,但这缺少一个重要的部分,如何从原始日期中提取小时和分钟@SalvatoreiOven只需编辑即可获得小时和分钟。@KennyTaiHuynh是的,但这些值是硬编码的,不是从原始日期中提取的。
@DavidConrad:好的,只需执行转换和使用LocalDateTime的步骤(如Java 8所支持的).LocalDateTime
是错误的类,因为它不能表示一个时刻,缺少时区或与UTC的偏移量。丢弃有价值的区域/偏移量信息无助于解决此问题。@SalvatoreIovene我认为这并没有遗漏要点。它将日期对象转换为可以比较的LocalTime对象。唯一缺少的一点是,生成的LocalTime对象可能具有非零秒或纳秒,但这不重要。在您的回答中,您可以完全以相同的方式进行转换。如果直接转换为LocalTime,则可以直接使用此类的compareToMethod。@SalvatoreiOven如果愿意,可以调用LocalTime对象上的getHour()和getMinute()访问器并进行比较。结果应该是相同的。如果您希望从比较中排除这些对象,则可以在比较之前对两个LocalTime
对象执行truncateTo(ChronoUnit.MINUTES)
或秒(0)。如果您只想LocalTime
,则没有理由使用LocalDateTime
,非常麻烦的旧日期时间类,如,和java.text.simpleDataFormat
,现在被内置在Java8和更高版本中的类所取代。请参阅。@Basil Bourque-topicstarter在其中一条评论中提到,java.util.Date是从第三方API返回的,他无法更改。请使用添加到旧类的新方法进行转换:然后调用Instant::atZone
和调用ZonedDateTime::toLocalTime
。