我需要检查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...
}


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

最佳答案

在Java 7的Calendar中,这可能是您可以做的最好的事情。我只添加一点细节,指定您想要在哪个时区中显示日期(如@Ole V.V.'s comment所示):

// 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



旧的类(DateCalendarSimpleDateFormat)具有lots of problemsdesign issues,它们已被新的API取代。

对于Android,您可以使用ThreeTen Backport,它是Java 8的新日期/时间类的很好的反向端口,同时还可以使用ThreeTenABP(有关如何使用它的更多信息here)。

以下所有类均在org.threeten.bp包下。当您仅比较日期(日/月/年)时,我正在使用org.threeten.bp.LocalDate类。我还使用org.threeten.bp.ZoneId指定时区,并使用org.threeten.bp.Instant类将long millis值转换为日期:

// 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()获取所有可用时区的列表)。

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



如果要比较日期和时间(日/月/年和小时/分钟/秒),可以使用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())));

关于java - 测试Java 7中今天是否存在Unix时间戳,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44762934/

10-09 18:53