我的Java
代码中有以下比较:
if(appointment.getEndDate().after(LocalDateTime.now()){
//do something
}
请注意,endDate
字段是一种Calendar
类型。
以这种方式进行比较是否有任何问题Calendar
,LocalDateTime
或者有更好的方法吗?
我的Java
代码中有以下比较:
if(appointment.getEndDate().after(LocalDateTime.now()){
//do something
}
请注意,endDate
字段是一种Calendar
类型。
以这种方式进行比较是否有任何问题Calendar
,LocalDateTime
或者有更好的方法吗?
以这种方式在 Calendar 和 LocalDateTime 之间进行比较是否有任何问题,或者有更好的方法吗?
是的,它会给你一个不正确的结果。此外,java.util
日期时间 API 及其格式化 APISimpleDateFormat
已过时且容易出错。建议完全停止使用它们并切换到现代日期时间 API *。
您应该将Calendar
对象转换为Instant
,然后您可以使用现代日期时间 API 来完成其余的事情。
演示:
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.Instant;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;
public class Main {
public static void main(String[] args) throws ParseException {
// A sample calendar object
String strDateTime = "10/02/2021 22:25";
SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy HH:mm", Locale.ENGLISH);
Date date = sdf.parse(strDateTime);
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
Instant instant = calendar.getTime().toInstant();
// Change the ZoneId as per your requirement e.g. ZoneId.of("Europe/London")
ZoneId zoneId = ZoneId.systemDefault();
ZonedDateTime zdt = instant.atZone(zoneId);
ZonedDateTime now = ZonedDateTime.now(zoneId);
System.out.println(zdt.isAfter(now));
}
}
输出:
true
从Trail: Date Time了解有关现代日期时间 API 的更多信息。
谢谢,Ole VV 为您提供宝贵的反馈:.
如果 OP 无法升级约会类以返回现代类型(如
ZonedDateTime
)作为结束日期时间,这就是要走的路。Calendar
也有一个toInstant 方法,所以你可以简单地使用Instant instant = calendar.toInstant();
。为了创建一个老式的样本,Calendar
我会使用像GregorianCalendar.from(ZonedDateTime.of(2021, 10, 2, 22, 25, 0, 0, ZoneId.systemDefault()))
* 出于任何原因,如果您必须坚持使用 Java 6 或 Java 7,则可以使用ThreeTen-Backport,它将大部分java.time功能向后移植到 Java 6 和 7。如果您正在为 Android 项目和 Android API 工作level 仍然不符合 Java-8,请检查Java 8+ APIs available through desugaring和How to use ThreeTenABP in Android Project。
您不应该将 aCalendar
与LocalDateTime
对象进行比较。根据文档,这将始终返回false
返回此 Calendar 是否表示指定 Object 表示的时间之后的时间。该方法等价于:
compareTo(when) > 0
当且仅当 when 是 Calendar 实例。否则,该方法返回 false。
您需要先将日历转换为 a LocalDateTime
,然后再将其与另一个进行比较LocalDateTime
您可以使用以下代码进行转换
LocalDateTime localDateTime = LocalDateTime.ofInstant(calendar.toInstant(), calendar.getTimeZone().toZoneId());