Java: Unix 时间,单位为秒到毫秒
Java: Unix time in seconds to milliseconds
我从 json 文件中得到一个 10 位 时间戳,我刚刚发现这是 Unix 时间 秒而不是以毫秒为单位.
所以我使用我的 DateUtils class 将以秒为单位的时间戳乘以 1000,以便将其转换为以毫秒为单位的时间戳。
当我尝试测试 isToday() 时,这行代码给了我一年大约 50000 的东西...
int otherYear = this.calendar.get(Calendar.YEAR);
这里有什么错误?
DateUtils.java
public class DateUtils{
public class DateUtils {
private Calendar calendar;
public DateUtils(long timeSeconds){
long timeMilli = timeSeconds * 1000;
this.calendar = Calendar.getInstance();
this.calendar.setTimeInMillis(timeMilli*1000);
}
private boolean isToday(){
Calendar today = Calendar.getInstance();
today.setTimeInMillis(System.currentTimeMillis());
// Todays date
int todayYear = today.get(Calendar.YEAR);
int todayMonth = today.get(Calendar.MONTH);
int todayDay = today.get(Calendar.DAY_OF_MONTH);
// Date to compare with today
int otherYear = this.calendar.get(Calendar.YEAR);
int otherMonth = this.calendar.get(Calendar.MONTH);
int otherDay = this.calendar.get(Calendar.DAY_OF_MONTH);
if (todayYear==otherYear && todayMonth==otherMonth && todayDay==otherDay){
return true;
}
return false;
}
}
问题出在这段代码中:
long timeMilli = timeSeconds * 1000;
this.calendar = Calendar.getInstance();
this.calendar.setTimeInMillis(timeMilli*1000);
您将时间乘以 1000 两次;删除其中一个 * 1000
,您应该可以开始了:)
public class DateUtils {
private Instant inst;
public DateUtils(long timeSeconds) {
this.inst = Instant.ofEpochSecond(timeSeconds);
}
private boolean isToday() {
ZoneId zone = ZoneId.systemDefault();
// Todays date
LocalDate today = LocalDate.now(zone);
// Date to compare with today
LocalDate otherDate = inst.atZone(zone).toLocalDate();
return today.equals(otherDate);
}
}
另一个答案是正确的。我发布此消息是为了告诉您 Calendar
class 早已过时,它在 java.time 中的替代品,现代 Java 日期和时间 API,是更好用,并提供更简单、更清晰的代码。作为一个细节,它接受自 Unix 纪元以来的 seconds,所以你不需要乘以 1000。没什么大不了的,你可能认为,但是一个或另一个 reader 在理解为什么乘以 1000 之前可能仍需要三思。他们现在不需要。
根据其他要求,您可能更愿意将实例变量设置为 ZonedDateTime
而不是 Instant
。在那种情况下,只需将 atZone
调用放入构造函数中,而不是将其放入 isToday
方法中。
Link: Oracle Tutorial: Date Time 解释如何使用 java.time.
我从 json 文件中得到一个 10 位 时间戳,我刚刚发现这是 Unix 时间 秒而不是以毫秒为单位.
所以我使用我的 DateUtils class 将以秒为单位的时间戳乘以 1000,以便将其转换为以毫秒为单位的时间戳。
当我尝试测试 isToday() 时,这行代码给了我一年大约 50000 的东西...
int otherYear = this.calendar.get(Calendar.YEAR);
这里有什么错误?
DateUtils.java
public class DateUtils{
public class DateUtils {
private Calendar calendar;
public DateUtils(long timeSeconds){
long timeMilli = timeSeconds * 1000;
this.calendar = Calendar.getInstance();
this.calendar.setTimeInMillis(timeMilli*1000);
}
private boolean isToday(){
Calendar today = Calendar.getInstance();
today.setTimeInMillis(System.currentTimeMillis());
// Todays date
int todayYear = today.get(Calendar.YEAR);
int todayMonth = today.get(Calendar.MONTH);
int todayDay = today.get(Calendar.DAY_OF_MONTH);
// Date to compare with today
int otherYear = this.calendar.get(Calendar.YEAR);
int otherMonth = this.calendar.get(Calendar.MONTH);
int otherDay = this.calendar.get(Calendar.DAY_OF_MONTH);
if (todayYear==otherYear && todayMonth==otherMonth && todayDay==otherDay){
return true;
}
return false;
}
}
问题出在这段代码中:
long timeMilli = timeSeconds * 1000;
this.calendar = Calendar.getInstance();
this.calendar.setTimeInMillis(timeMilli*1000);
您将时间乘以 1000 两次;删除其中一个 * 1000
,您应该可以开始了:)
public class DateUtils {
private Instant inst;
public DateUtils(long timeSeconds) {
this.inst = Instant.ofEpochSecond(timeSeconds);
}
private boolean isToday() {
ZoneId zone = ZoneId.systemDefault();
// Todays date
LocalDate today = LocalDate.now(zone);
// Date to compare with today
LocalDate otherDate = inst.atZone(zone).toLocalDate();
return today.equals(otherDate);
}
}
另一个答案是正确的。我发布此消息是为了告诉您 Calendar
class 早已过时,它在 java.time 中的替代品,现代 Java 日期和时间 API,是更好用,并提供更简单、更清晰的代码。作为一个细节,它接受自 Unix 纪元以来的 seconds,所以你不需要乘以 1000。没什么大不了的,你可能认为,但是一个或另一个 reader 在理解为什么乘以 1000 之前可能仍需要三思。他们现在不需要。
根据其他要求,您可能更愿意将实例变量设置为 ZonedDateTime
而不是 Instant
。在那种情况下,只需将 atZone
调用放入构造函数中,而不是将其放入 isToday
方法中。
Link: Oracle Tutorial: Date Time 解释如何使用 java.time.