【问题标题】:Comparing string date with today's date比较字符串日期和今天的日期
【发布时间】:2014-09-09 02:39:18
【问题描述】:

所以我有一个字符串“2014-06-30 15:27”,如果它是今天的日期,它应该只返回“15:27”,否则返回“30/06/2014”。我已经尝试过 simpleDateFormat.parse 但效果不佳。

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

【问题讨论】:

标签: java android date datetime compare


【解决方案1】:
    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));
    }

【讨论】:

  • 您忘记了 1) 传入日期也可能是午夜(因此,相等 - 不幸的是,您不能使用 .equals(...) 方法,因为它考虑到时区等问题,您需要 @987654328 @ ,这也可以让您一次性进行比较),2)时间戳具有小数秒。
  • 感谢您的反馈。我对代码进行了一些编辑。 Calendar.HOUR 是一个错字,应该是 Calendar.HOUR_OF_DAY。现在在 Calendar 上使用 compareTo 进行日期比较。我还清除了午夜值的毫秒数。
  • 仅供参考,非常麻烦的旧日期时间类,如 java.util.Datejava.util.Calendarjava.text.SimpleDateFormat 现在是 legacy,被 Java 8 中内置的 java.time 类所取代,之后。见Tutorial by Oracle
【解决方案2】:

LocalDateTime

首先将字符串解析为LocalDateTime。将中间的 SPACE 替换为 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();

今天

时区对于确定日期至关重要。对于任何给定的时刻,日期在全球范围内因区域而异。例如,Paris France 中午夜后几分钟是新的一天,而 Montréal Québec 中仍然是“昨天”。

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 及更高版本中。这些类取代了麻烦的旧 legacy 日期时间类,例如 java.util.DateCalendarSimpleDateFormat

Joda-Time 项目现在位于maintenance mode,建议迁移到java.time 类。

要了解更多信息,请参阅Oracle Tutorial。并在 Stack Overflow 上搜索许多示例和解释。规格为JSR 310

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

从哪里获得 java.time 类?

ThreeTen-Extra 项目通过附加类扩展了 java.time。该项目是未来可能添加到 java.time 的试验场。您可以在这里找到一些有用的类,例如IntervalYearWeekYearQuartermore

【讨论】:

    【解决方案3】:

    只需使用 Date 类...

    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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-03
      • 1970-01-01
      • 2015-11-24
      • 2011-01-08
      • 2023-03-13
      • 1970-01-01
      相关资源
      最近更新 更多