【问题标题】:issue with comparing two dates in joda time API在 joda time API 中比较两个日期的问题
【发布时间】:2017-01-20 09:54:06
【问题描述】:

我有一个下面的程序来比较两个日期。

我得到的时间戳是 date1 和 currentTimestamp,在这里我只需要比较日期而不是时间值。但下面的程序总是返回 -1。(值)

timestamp date1 = "2017-01-20 14:51:30.091"  // i get this from service call in this format

SimpleDateFormat dateFormat = new SimpleDateFormat(DEFAULT_TIMESTAMP_FORMAT);
Calendar calendar = Calendar.getInstance();
String formattedDate = dateFormat.format(calendar.getTime());
java.util.Date currentDate = dateFormat.parse(formattedDate);
java.sql.Timestamp currentTimestamp = new java.sql.Timestamp(currentDate.getTime());

int value = DateTimeComparator.getDateOnlyInstance().compare(date1 , currentTimestamp );

如何只比较日期而不考虑时间。请帮我解决这个问题。

更新:

我改成下面的代码

timestamp date1 = "2017-01-20 14:51:30.091"  // i get this from service call in this format
 LocalDate localDate = new LocalDate();
int value = DateTimeComparator.getDateOnlyInstance().compare(date1 , localDate );

这给了我错误提示“java.lang.IllegalArgumentException: No Instant Converter found for type: org.joda.time.LocalDate”

【问题讨论】:

  • 嗯。要使用 Joda 时间,请不要使用 CalendarSimpleDateFormatjava.util.Datejava.sql.Timestamp使用Joda-time classes
  • 也许我看错了,但你发布的代码中 Joda 在哪里??
  • @RealSkeptic 我更改为 localdate 以获取当前日期,但它给出错误“java.lang.IllegalArgumentException: No instant converter found for type: org.joda.time.LocalDate”
  • 什么是timestamp?看起来它应该是某种类或类型名称,但是您要为其分配一个字符串?请发布真实代码。如前所述,minimal reproducible example 是最好的。

标签: java date jodatime


【解决方案1】:

这不是 Joda 解决方案...

使用:Apache 库 'commons-lang3-x.x.jar' (DateUtils)

@Test
public void testCompare() {
 Date current = new Date();
 Date previous = DateUtils.addHours(DateUtils.addDays(new Date(), -1),5);
 assertEquals(1,DateUtils.truncatedCompareTo(current,previous,Calendar.DATE));
 assertEquals(0,DateUtils.truncatedCompareTo(current,current,Calendar.DATE));
 assertEquals(-1,DateUtils.truncatedCompareTo(previous,current,Calendar.DATE));
}

【讨论】:

    【解决方案2】:

    您可以使用 JodaTime 尝试此代码: DateTime date1 = DateTime.parse("2017-01-20 14:51:30.091", DateTimeFormat.forPattern("YYYY-MM-dd HH:mm:ss.SSS")); DateTime now = new DateTime(); int value = DateTimeComparator.getDateOnlyInstance().compare(date1 , now);

    【讨论】:

      【解决方案3】:

      要在没有时间的情况下比较 DateTimejoda,您有 2 个选项:

      • DateTime 转换为LocalDate
      • 使用DateTimeComparator.getDateOnlyInstance

      例如:

      @Test
      public void compareJodaTime() {
          DateTimeFormatter dateTimeFormatter = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss.SSS");
      
          String today = "2017-01-20 14:51:30.091";  
          String tomorrow = "2017-01-21 14:51:30.091"; 
      
          DateTime now = DateTime.now();
      
          Assert.assertThat(now.toLocalDate().compareTo(DateTime.parse(today, dateTimeFormatter).toLocalDate()), Matchers.is(0));
          Assert.assertThat(now.toLocalDate().compareTo(DateTime.parse(tomorrow, dateTimeFormatter).toLocalDate()), Matchers.is(-1));
          Assert.assertThat(now.toLocalDate().isEqual(DateTime.parse(today, dateTimeFormatter).toLocalDate()), Matchers.is(true));
          Assert.assertThat(now.toLocalDate().isBefore(DateTime.parse(tomorrow, dateTimeFormatter).toLocalDate()), Matchers.is(true));
      
      
          Assert.assertThat(DateTimeComparator.getDateOnlyInstance().compare(now, DateTime.parse(today, dateTimeFormatter)), Matchers.is(0));
          Assert.assertThat(DateTimeComparator.getDateOnlyInstance().compare(now, DateTime.parse(tomorrow, dateTimeFormatter)), Matchers.is(-1));
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-08-28
        • 1970-01-01
        • 2012-11-25
        • 1970-01-01
        • 2011-04-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多