测试 Unix 时间戳是否在今天 Java 7

Test if Unix time-stamp is today in Java 7

我需要检查 Unix 时间戳(存储为 long)是否代表今天(在我的时区)。这就是我所在的位置,但它看起来不是很优雅:

Calendar tokenTimestamp = Calendar.getInstance();
tokenTimestamp.setTimeInMillis(foo.getDateTimeCreated());

Calendar now = Calendar.getInstance();

if (tokenTimestamp.get(Calendar.DAY_OF_MONTH) != now.get(Calendar.DAY_OF_MONTH)
        || tokenTimestamp.get(Calendar.MONTH) != now.get(Calendar.MONTH)
        || tokenTimestamp.get(Calendar.YEAR) != now.get(Calendar.YEAR)) {
    // Not today...
}

有没有更正确的and/or优雅的方法来做到这一点?

您可以采用 here 中的方法:定义开始日期(今天,凌晨 0 点)和结束日期(今天,23:59pm)。 然后你可以检查时间是否介于:

boolean isWithinToday(Date testDate) {
   return !(testDate.before(startTime) || testDate.after(endTime));
}

在 Java 7 的 Calendar 中,这可能是您能做的最好的了。我会添加一点细节,指定你想要日期的时区(如 所指出的):

// current date in system default timezone
Calendar.getInstance(TimeZone.getDefault());
// current date in Europe/London timezone
Calendar.getInstance(TimeZone.getTimeZone("Europe/London"));

也使用 IANA timezones names(始终采用 Continent/City 格式,如 America/Sao_PauloEurope/Berlin)。 避免使用 3 个字母的缩写(如 CSTPST),因为它们是 ambiguous and not standard.


旧的 classes(DateCalendarSimpleDateFormat)有 lots of problems and design issues,它们将被新的 API 取代。

对于 Android 你可以使用 ThreeTen Backport, a great backport for Java 8's new date/time classes, together with the ThreeTenABP (more on how to use it ).

以下所有class都在org.threeten.bp包下。当您只比较日期 (day/month/year) 时,我使用的是 org.threeten.bp.LocalDate class。我还使用 org.threeten.bp.ZoneId 指定时区,并使用 org.threeten.bp.Instant class 将 long 毫秒值转换为日期:

// millis value
long millis = 1498499869249L;

// get the date in system default timezone
LocalDate dt = Instant.ofEpochMilli(millis).atZone(ZoneId.systemDefault()).toLocalDate();
// check if it's equals to today
System.out.println(dt.equals(LocalDate.now(ZoneId.systemDefault())));

如果您想要不同的时区,请将 ZoneId.systemDefault() 替换为 ZoneId.of("Europe/London")(或您想要的任何时区名称 - 您可以获得 通过调用 ZoneId.getAvailableZoneIds()).

列出所有可用时区

并且不要忘记在两行中使用相同的时区,以确保您比较的是正确的值。


如果你想比较日期和时间(day/month/year和hour/minute/second),你可以使用org.threeten.bp.LocalDateTime代替:

// get the date in system default timezone
LocalDateTime dt = Instant.ofEpochMilli(millis).atZone(ZoneId.systemDefault()).toLocalDateTime();
// check if it's equals to today
System.out.println(dt.equals(LocalDateTime.now(ZoneId.systemDefault())));