【问题标题】:calendar.getTime().equals(cal1) return false though both calendars has same timecalendar.getTime().equals(cal1) 尽管两个日历具有相同的时间,但返回 false
【发布时间】:2020-11-29 23:01:36
【问题描述】:
    Calendar calendar = Calendar.getInstance();
    Calendar cal1 = Calendar.getInstance();

    if (calendar.getTime().equals(cal1.getTime())) {
        System.out.println("Hi!");
    }

打印calendar.getTime()cal1.getTime() 返回

2020 年 8 月 10 日星期一 16:00:10 IST
2020 年 8 月 10 日星期一 16:00:11 IST

以下代码按预期工作,打印 Hi! 它应该为相等检查返回 true,但事实并非如此。

    if (!calendar.getTime().after(cal1.getTime()) || !calendar.getTime().before(cal1.getTime())) {
        System.out.println("Hi!");
    }

那为什么等于检查返回 false 呢?

【问题讨论】:

    标签: java datetime java.util.calendar


    【解决方案1】:

    Mon Aug 10 16:00:10 IST 2020Mon Aug 10 16:00:11 IST 2020 以秒为单位。

    另外,我建议您不要使用过时且容易出错的java.util date-time API。请改用modern date time API,如下所示:

    import java.time.LocalDateTime;
    import java.time.format.DateTimeFormatter;
    import java.util.Locale;
    
    public class Main {
        public static void main(String[] args) {
            String dateTimeStr1 = "Mon Aug 10 16:00:10 IST 2020";
            String dateTimeStr2 = "Mon Aug 10 16:00:11 IST 2020";
    
            DateTimeFormatter formatter = DateTimeFormatter.ofPattern("E MMM dd HH:mm:ss z u", Locale.ENGLISH);
    
            LocalDateTime date1 = LocalDateTime.parse(dateTimeStr1, formatter);
            LocalDateTime date2 = LocalDateTime.parse(dateTimeStr2, formatter);
    
            System.out.println(date1.equals(date2));
        }
    }
    

    输出:

    false
    

    如何通过排除秒来比较它们:

    import java.time.LocalDateTime;
    import java.time.LocalTime;
    import java.time.format.DateTimeFormatter;
    import java.util.Locale;
    
    public class Main {
        public static void main(String[] args) {
            String dateTimeStr1 = "Mon Aug 10 16:00:10 IST 2020";
            String dateTimeStr2 = "Mon Aug 10 16:00:11 IST 2020";
    
            // Define the formatter
            DateTimeFormatter formatter = DateTimeFormatter.ofPattern("E MMM dd HH:mm:ss z u", Locale.ENGLISH);
    
            // Parse the date-time strings into LocalDateTime
            LocalDateTime date1 = LocalDateTime.parse(dateTimeStr1, formatter);
            LocalDateTime date2 = LocalDateTime.parse(dateTimeStr2, formatter);
    
            // Create LocalDateTime instances from the parsed ones by excluding seconds
            LocalDateTime date1WithoutSec = LocalDateTime.of(date1.toLocalDate(),
                    LocalTime.of(date1.getHour(), date1.getMinute()));
            LocalDateTime date2WithoutSec = LocalDateTime.of(date2.toLocalDate(),
                    LocalTime.of(date2.getHour(), date2.getMinute()));
    
            System.out.println(date1WithoutSec.equals(date2WithoutSec));
        }
    }
    

    输出:

    true
    

    【讨论】:

    • 我没有更改 API,而是尝试了这个,它按预期工作。 calendar.setTimeInMillis(0);calendar1.setTimeInMillis(0);
    • @Hemlata - 您应该停止使用设计不佳的旧版日期时间 API。向 Trail: Date Time 学习新 API
    • @A 谢谢我要切换到它。
    • 一个包含很多好信息的答案。你摆脱秒的方式是不必要的低水平。我建议LocalDateTime date1WithoutSec = date1.truncatedTo(ChronoUnit.MINUTES);(日期 2 类似)。
    • @Hemlata 您使用setTimeInMillis() 的技巧可确保对象始终相等,即使它们从一开始就相隔几个世纪。 Calendar 令人困惑的设计并没有说明这一点。使用 java.time 会更难犯类似的错误。我确实鼓励您迁移到 java.time。
    【解决方案2】:

    它们根本不相等,你可以看到。

    8 月 10 日星期一 16:00:10 IST 2020

    8 月 10 日星期一 16:00:11 IST 2020。

    你的第二个 if 里面有 or 所以它返回 true

    【讨论】:

    • 哦,对不起,我没有注意到秒。
    • @所以让我知道如何在检查等于时避免秒?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-05
    • 2011-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多