比较字符串日期和今天的日期

3

我有一个字符串"2014-06-30 15:27",如果它是今天的日期,应该返回"15:27",否则返回"30/06/2014"。我已经尝试使用simpleDateFormat.parse,但它并没有很好地工作。

holder.data.setText(mensagem.getDate());

1
使用此格式进行处理 http://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html - bumbumpaw
1
看看这个:http://www.mkyong.com/java/how-to-compare-dates-in-java/ - Aniruddha
4个回答

5
    final String stringDate = "2014-07-17 23:59";

    SimpleDateFormat inputFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm");
    Date date = inputFormat.parse(stringDate);

    Calendar calendarDate = Calendar.getInstance();
    calendarDate.setTime(date);

    Calendar midnight = Calendar.getInstance();
    midnight.set(Calendar.HOUR_OF_DAY, 0);
    midnight.set(Calendar.MINUTE, 0);
    midnight.set(Calendar.SECOND, 0);
    midnight.set(Calendar.MILLISECOND, 0);

    if (calendarDate.compareTo(midnight) >= 0)
    {
        SimpleDateFormat timeFormat = new SimpleDateFormat("HH:mm");
        System.out.println(timeFormat.format(date));
    }
    else
    {
        SimpleDateFormat dateTimeForm = new SimpleDateFormat("dd/MM/yyyy HH:mm");
        System.out.println(dateTimeForm.format(date));
    }

2
你忘记了以下两点:1)传入的日期可能也是午夜(因此相等-不幸的是,由于它考虑时区等因素,你不能使用.equals(...)方法,你需要使用compareTo(...),这也可以让你一次性进行比较),2)时间戳具有小数秒。 - Clockwork-Muse
1
感谢反馈。我对代码进行了一些编辑。Calendar.HOUR 是一个打字错误,应该是 Calendar.HOUR_OF_DAY。现在使用 Calendar 上的 compareTo 进行日期比较。我还清除了午夜值上的毫秒。 - fipple
请注意,像java.util.Datejava.util.Calendarjava.text.SimpleDateFormat这样的旧日期时间类现在已经成为遗留系统,被内置于Java 8及更高版本中的java.time类所取代。请参阅Oracle的教程 - Basil Bourque

1

LocalDateTime

首先将字符串解析为LocalDateTime。将中间的空格替换为T以符合标准的ISO 8601格式。java.time类默认支持ISO 8601格式。

LocalDateTime ldt = LocalDateTime.parse ( "2014-06-30 15:27".replace ( " " , "T" ) );

ldt.toString(): 2014-06-30T15:27

这个值没有实际意义。输入字符串缺乏有关UTC偏移或时区的任何线索。因此,我们不知道这是新西兰奥克兰下午3点还是加拿大魁北克下午3点,这是两个非常不同的时刻。您应该分配由您的业务情况指示的偏移量或时区。在Stack Overflow上搜索如何执行此操作,重点关注类OffsetDateTimeZonedDateTime。我暂时跳过这个关键问题。

LocalDate

提取仅日期值。LocalDate类表示仅具有日期而没有时间和时区的值。

LocalDate ld = ldt.toLocalDate();

今天

时区对于确定日期非常重要。对于任何给定的时刻,日期因时区而异。例如,在法国巴黎的午夜过后几分钟是新的一天,而在加拿大魁北克省蒙特利尔仍然是“昨天”。

ZoneId z = ZoneId.of( "America/Montreal" );
LocalDate today = LocalDate.now( z );

比较

您可以通过调用compareToequalsisEqualisBeforeisAfter等方法来比较LocalDate对象。

if( today.isEqual( ld ) ) {
    return ldt.toLocalTime();
} else {
    return ld;
}

关于 java.time

java.time框架是Java 8及更高版本内置的。这些类取代了老旧的遗留日期时间类,如java.util.DateCalendarSimpleDateFormat

Joda-Time 项目现在处于维护模式,建议迁移到 java.time 类。

想要了解更多,请查看 Oracle 教程。并在 Stack Overflow 上搜索许多示例和解释。规范是 JSR 310

您可以直接与数据库交换 java.time 对象。使用符合 JDBC 4.2 或更高版本的 JDBC 驱动程序。无需字符串,无需 java.sql.* 类。

如何获取 java.time 类?

ThreeTen-Extra 项目通过添加额外的类扩展了 java.time。该项目是 java.time 可能未来新增内容的试验场。您可能会在这里找到一些有用的类,例如 Interval, YearWeek, YearQuarter更多


1

由于java.time库是使用日期和时间的推荐方式。因此,要将当前日期与字符串日期进行比较,您需要首先将字符串格式的日期转换为java.time.LocalDate

LocalDate paresedStringDate = LocalDate.parse("2022-11-10");

之后,您可以使用以下代码获取当前日期:

LocalDate currentDate = LocalDate.now();

然后您可以使用以下代码比较当前日期和解析的字符串日期,以检查两者是否相同:

if (paresedStringDate.compareTo(currentDate) == 0) {
   //do what you want to do here
}

1
更易读:paresedStringDate.isEqual(currentDate) - Ole V.V.

0

只需使用日期类...

SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
Date exitdate = df.parse("2019-01-17");
Date currdate = new Date();
long diff = currdate.getTime() - exitdate.getTime();
long days = TimeUnit.DAYS.convert(diff, TimeUnit.MILLISECONDS);

if(days==0)
{
    System.out.println("IS TRUE"+currdate.toString());
    return true;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接