java - 从纪元开始获取天数

标签 java datetime jodatime

我想要从纪元(1970-01-01)开始的天数。我试过 joda-time

try {
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    Date date1 = sdf.parse("2013-05-03 07:00:00");
    Date date2 = sdf.parse("2013-05-03 23:30:00");


    MutableDateTime epoch = new MutableDateTime();
    epoch.setDate(0); //Set to Epoch time
    System.out.println("Epoch: " + epoch);
    Days days1 = Days.daysBetween(epoch, new MutableDateTime(date1.getTime()));
    Days days2 = Days.daysBetween(epoch, new MutableDateTime(date2.getTime()));
    System.out.println("1) Days Since Epoch: " + days1.getDays());
    System.out.println("2) Days Since Epoch: " + days2.getDays());
} catch (ParseException e) {
    e.printStackTrace(); 
}

并使用逻辑:
// Create Calendar instance
    Calendar calendar1 = Calendar.getInstance();
    Calendar calendar2 = Calendar.getInstance();
    calendar2.setTime(date);
    // Set the values for the calendar fields YEAR, MONTH, and DAY_OF_MONTH.

//calendar1.set(calendar1.YEAR, calendar1.MONTH, Calendar.DAY_OF_MONTH);
calendar1.set(1970, 1, 1);
    /*
     * Use getTimeInMillis() method to get the Calendar's time value in
     * milliseconds. This method returns the current time as UTC
     * milliseconds from the epoch
     */
    long miliSecondForDate1 = calendar1.getTimeInMillis();
    long miliSecondForDate2 = calendar2.getTimeInMillis();

    // Calculate the difference in millisecond between two dates
    long diffInMilis = miliSecondForDate2 - miliSecondForDate1;

    /*
     * Now we have difference between two date in form of millsecond we can
     * easily convert it Minute / Hour / Days by dividing the difference
     * with appropriate value. 1 Second : 1000 milisecond 1 Hour : 60 * 1000
     * millisecond 1 Day : 24 * 60 * 1000 milisecond
     */

    long diffInSecond = diffInMilis / 1000;
    long diffInMinute = diffInMilis / (60 * 1000);
    long diffInHour = diffInMilis / (60 * 60 * 1000);
    long diffInDays = diffInMilis / (24 * 60 * 60 * 1000);
    if(logger.isInfoEnabled()) {
        logger.info("Difference in Seconds : " + diffInSecond);
        logger.info("Difference in Minute : " + diffInMinute);
        logger.info("Difference in Hours : " + diffInHour);
        logger.info("Difference in Days : " + diffInDays);
    }

我得到了这两个的差异结果。有人可以在我错的地方提供帮助。

谢谢。

最佳答案

17006 和 17007 相差一天。这种差异很可能来自您所在时区的 7:00 和 23:30 在其他时区的不同日期,例如 UTC。或者反过来说,UTC 中的那些时间恰好在您所在时区的不同日期。因此计数减一。我不知道 JodaTime,所以我不能给你确切的细节。

16975 和 17006 之间的差异是 31 天或一整月。我可以准确地告诉你这是从哪里来的。 Calendar月份是从 0 开始的:一月是 0 月,二月是 1 月,等等。所以 calendar1.set(1970, 1, 1)将您的日历设置为 1970 年 2 月 1 日,即纪元后 31 天。使用calendar1.set(1970, Calendar.JANUARY, 1)反而。您还需要控制 Calendar 的小时、分钟和秒。 .您可以调用clear()之前 set()以确保时间是在午夜。

如果你可以使用 Java 8,你可以这样做:

    DateTimeFormatter format = DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss");
    OffsetDateTime t1 = LocalDateTime.parse("2013-05-03 07:00:00", format)
            .atOffset(ZoneOffset.UTC);
    OffsetDateTime t2 = LocalDateTime.parse("2013-05-03 23:30:00", format)
            .atOffset(ZoneOffset.UTC);

    System.out.println("1) Days Since Epoch: " + ChronoUnit.DAYS.between(Instant.EPOCH, t1));
    System.out.println("2) Days Since Epoch: " + ChronoUnit.DAYS.between(Instant.EPOCH, t2));

这打印:
1) Days Since Epoch: 15828
2) Days Since Epoch: 15828

如果您想使用不同的时区:
    DateTimeFormatter format = DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss");
    ZonedDateTime t1 = LocalDateTime.parse("2013-05-03 07:00:00", format)
            .atZone(ZoneId.systemDefault());
    ZonedDateTime t2 = LocalDateTime.parse("2013-05-03 23:30:00", format)
            .atZone(ZoneId.systemDefault());

    System.out.println("1) Days Since Epoch: " + ChronoUnit.DAYS.between(Instant.EPOCH, t1));
    System.out.println("2) Days Since Epoch: " + ChronoUnit.DAYS.between(Instant.EPOCH, t2));

您可以填写所需的时区而不是ZoneId.systemDefault() .

关于java - 从纪元开始获取天数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43065608/

相关文章:

java - 如何检查我们现在是否位于两个日期时间对象之间?

java - Joda Time 未得到预期结果

java - ComponentScan 如何工作?

python - 日期时间Python

java - 转换 Java 8's LocalDateTime to Joda' s LocalDateTime 的简单方法

Javascript、时间和日期 : Getting the next day, 周、月、年等

java - 使用反编译的java代码

java - 向 Activity 发送包数据的 Android 服务为 NULL

java - 为实体管理器获取适当的属性

java - Joda-时间 DateTimeZone