我需要检查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_Paulo
或Europe/Berlin
)。避免使用3个字母的缩写(例如
CST
或PST
),因为它们是ambiguous and not standard。旧的类(
Date
,Calendar
和SimpleDateFormat
)具有lots of problems和design 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/