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

在Java 7中测试Unix时间戳是否为今天,java,unix,timestamp,epoch,date-comparison,Java,Unix,Timestamp,Epoch,Date Comparison,我需要检查Unix时间戳(存储为long)是否表示今天(在我的时区)。这就是我所处的位置,但它看起来并不优雅: Calendar tokenTimestamp = Calendar.getInstance(); tokenTimestamp.setTimeInMillis(foo.getDateTimeCreated()); Calendar now = Calendar.getInstance(); if (tokenTimestamp.get(Calendar.DAY_OF_MONTH)

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

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

您可以从以下方面入手:定义开始日期(今天,上午0点)和结束日期(今天,下午23:59点)。 然后,您可以通过以下方式检查时间是否介于两者之间:

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

在Java7的
日历中,这可能是您所能做的最好的了。我只想添加一点细节,指定日期的时区(如所示):

同时使用(始终采用
大陆/城市
格式,如
美国/圣保罗
欧洲/柏林
)。 避免使用三个字母的缩写(如
CST
PST
),因为它们是


旧类(
Date
Calendar
SimpleDateFormat
)具有和,它们正在被新的API所取代

对于Android,您可以使用,这是Java8新的日期/时间类的一个很好的后端口,以及(关于如何使用它的更多信息)

下面的所有类都在
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(“欧洲/伦敦”)
(或您想要的任何时区名称-您可以获得 通过调用
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.util.Calendar
而不是
java.time
API?后者要简单得多……我使用的是Android,所以必须使用Java 7。简单地说:不,没有更好的方法。在Java7中,您正在以最好的方式完成它。恕我直言,@VGR。首先,“今天”是一个时区相关的概念,所以最好给操作一个明确的时区,这样读者就可以知道时区很重要,并且知道你想要的时区(而不是想你可能忘了给一个时区)。好的答案。在所有代码片段中,我希望将时区(无论是
TimeZone
还是
ZoneId
)存储在一个变量中,以确保即使有人更改默认值,我每次都使用相同的时区。只是为了防止这个不太可能但可能令人讨厌的角落事件。
// 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())));