测试 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_Paulo
或 Europe/Berlin
)。
避免使用 3 个字母的缩写(如 CST
或 PST
),因为它们是 ambiguous and not standard.
旧的 classes(Date
、Calendar
和 SimpleDateFormat
)有 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())));
我需要检查 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_Paulo
或 Europe/Berlin
)。
避免使用 3 个字母的缩写(如 CST
或 PST
),因为它们是 ambiguous and not standard.
旧的 classes(Date
、Calendar
和 SimpleDateFormat
)有 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())));