0

我从一个 json 文件中得到一个10 位的时间戳,我刚刚发现这是 Unix 时间,以秒为单位,而不是以毫秒为单位

所以我去了我的 DateUtils 类,将时间戳(以秒为单位)乘以 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;
    }
}
4

2 回答 2

2

问题出在这段代码中:

    long timeMilli = timeSeconds * 1000;
    this.calendar = Calendar.getInstance();
    this.calendar.setTimeInMillis(timeMilli*1000);

您将时间乘以 1000 两次;删除其中一个,* 1000你应该很高兴:)

于 2018-03-01T18:50:54.000 回答
0
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该类早已过时,并且它在 java.time(现代 Java 日期和时间 API)中的替代品使用起来非常好用,并且提供了更简单、更清晰的代码。作为一个细节,它接受自 Unix 纪元以来的秒数,因此您不需要乘以 1000。您可能认为没什么大不了的,但在理解您为什么乘以 1000 之前,一位或另一位读者可能仍然需要三思而后行. 他们现在不需要。

根据其他要求,您可能更喜欢让您的实例变量为 aZonedDateTime而不是Instant. 在这种情况下,只需将atZone调用放入构造函数中,而不是将其放入isToday方法中。

链接Oracle 教程:解释如何使用 java.time 的日期时间。

于 2018-03-02T06:59:48.413 回答