1

我的Java代码中有以下比较:

if(appointment.getEndDate().after(LocalDateTime.now()){

//do something
}

请注意,endDate字段是一种Calendar类型。

以这种方式进行比较是否有任何问题CalendarLocalDateTime或者有更好的方法吗?

4

2 回答 2

4

以这种方式在 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 desugaringHow to use ThreeTenABP in Android Project

于 2021-03-05T12:48:25.963 回答
3

您不应该将 aCalendarLocalDateTime对象进行比较。根据文档,这将始终返回false

返回此 Calendar 是否表示指定 Object 表示的时间之后的时间。该方法等价于:

compareTo(when) > 0

当且仅当 when 是 Calendar 实例。否则,该方法返回 false。

您需要先将日历转换为 a LocalDateTime,然后再将其与另一个进行比较LocalDateTime

您可以使用以下代码进行转换

LocalDateTime localDateTime = LocalDateTime.ofInstant(calendar.toInstant(), calendar.getTimeZone().toZoneId());
于 2021-03-05T12:32:53.140 回答