我有两个Date
对象,格式如下。
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
String matchDateTime = sdf.parse("2014-01-16T10:25:00");
Date matchDateTime = null;
try {
matchDateTime = sdf.parse(newMatchDateTimeString);
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// get the current date
Date currenthDateTime = null;
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
Date dt = new Date();
String currentDateTimeString = dateFormat.format(dt);
Log.v("CCCCCurrent DDDate String is:", "" + currentDateTimeString);
try {
currenthDateTime = sdf.parse(currentDateTimeString);
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
现在我想把上面两个日期和时间进行比较。我应该如何在Java中进行比较。
感谢
由于Date
实现了Comparable<Date>
,它就像一样简单
date1.compareTo(date2);
正如Comparable
合同所规定的,如果date1
被认为分别小于/等于/大于date2
(即,在这种情况下,在之前/相同/之后),则它将返回负整数/零/正整数。
注意,Date
还有.after()
和.before()
方法,它们将返回布尔值。
替代方案是…
将两个日期转换为毫秒,如下所示
Date d = new Date();
long l = d.getTime();
现在比较两个长值
使用compareTo()
返回值
如果参数Date等于此日期,则为0;如果此日期在Date参数之前,则为小于0的值;如果此日期在Date参数之后,则为大于0的值。
喜欢
if(date1.compareTo(date2)>0)
另一种选择是Joda Time。
使用日期时间
DateTime date = new DateTime(new Date());
date.isBeforeNow();
or
date.isAfterNow();
// Get calendar set to the current date and time
Calendar cal = Calendar.getInstance();
// Set time of calendar to 18:00
cal.set(Calendar.HOUR_OF_DAY, 18);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);
// Check if current time is after 18:00 today
boolean afterSix = Calendar.getInstance().after(cal);
if (afterSix) {
System.out.println("Go home, it's after 6 PM!");
}
else {
System.out.println("Hello!");
}
其他答案通常都是正确的,而且都过时了。请使用现代java日期和时间API java.time来进行日期和时间工作。与2014年2月提出这个问题时的情况相比,有了java.time,你的工作也变得容易多了。
String dateTimeString = "2014-01-16T10:25:00";
LocalDateTime dateTime = LocalDateTime.parse(dateTimeString);
LocalDateTime now = LocalDateTime.now(ZoneId.systemDefault());
if (dateTime.isBefore(now)) {
System.out.println(dateTimeString + " is in the past");
} else if (dateTime.isAfter(now)) {
System.out.println(dateTimeString + " is in the future");
} else {
System.out.println(dateTimeString + " is now");
}
当在2020年运行时,这个片段的输出是:
2014-01-16T10:25:00是过去的
由于您的字符串没有通知我们任何时区或UTC偏移量,我们需要知道了解了什么。上面的代码使用设备的时区设置。对于已知的时区,例如使用CCD_ 11。指定ZoneOffset.UTC
作为UTC。
我正在利用您的字符串是ISO 8601格式的事实。java.time的类解析最常见的ISO8601变体,而不需要我们提供任何格式化程序。
问:对于Android开发,java.time不需要Android API 26级吗
java.time在较旧和较新的Android设备上都能很好地工作。它只需要至少Java 6。
- 在Java 8及更高版本中,以及在较新的Android设备上(从API 26级开始),现代API内置
- 在非Android Java 6和7中,获得ThreeTen Backport,即现代类的Backport(JSR310的ThreeTen;请参阅底部的链接)
- 在(旧的)安卓系统上使用安卓版的ThreeTen Backport。它被称为ThreeTenABP。并确保使用子包从
org.threeten.bp
导入日期和时间类
链接
- Oracle教程:日期时间,解释如何使用java.Time
- Java规范请求(JSR)310,其中首次描述了
java.time
- ThreeTen Backport项目,
java.time
到Java 6和7的Backport(JSR-310的ThreeTen) - ThreeTenABP,安卓版ThreeTen背包
- 问题:如何在Android项目中使用ThreeTenABP,有一个非常彻底的解释
- 维基百科文章:ISO 8601