从时代开始 - java

我想要从纪元(1970-01-01)开始的天数。我尝试过乔达时间

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-搜索字符串数组中的字符串 - java

在Java中,我们是否有任何方法可以发现特定字符串是字符串数组的一部分。我可以避免出现一个循环。例如String [] array = {"AA","BB","CC" }; string x = "BB" 我想要一个if (some condition to tell wheth…

Java Double与BigDecimal - java

我正在查看一些使用双精度变量来存储(360-359.9998779296875)结果为0.0001220703125的代码。 double变量将其存储为-1.220703125E-4。当我使用BigDecimal时,其存储为0.0001220703125。为什么将它双重存储为-1.220703125E-4? 参考方案 我不会在这里提及精度问题,而只会提及数字…

Java:线程池如何将线程映射到可运行对象 - java

试图绕过Java并发问题,并且很难理解线程池,线程以及它们正在执行的可运行“任务”之间的关系。如果我创建一个有10个线程的线程池,那么我是否必须将相同的任务传递给池中的每个线程,或者池化的线程实际上只是与任务无关的“工人无人机”可用于执行任何任务?无论哪种方式,Executor / ExecutorService如何将正确的任务分配给正确的线程? 参考方案 …

当回复有时是一个对象有时是一个数组时,如何在使用改造时解析JSON回复? - java

我正在使用Retrofit来获取JSON答复。这是我实施的一部分-@GET("/api/report/list") Observable<Bills> listBill(@Query("employee_id") String employeeID); 而条例草案类是-public static class…

JAVA:字节码和二进制有什么区别? - java

java字节代码(已编译的语言,也称为目标代码)与机器代码(当前计算机的本机代码)之间有什么区别?我读过一些书,他们将字节码称为二进制指令,但我不知道为什么。 参考方案 字节码是独立于平台的,在Windows中运行的编译器编译的字节码仍将在linux / unix / mac中运行。机器代码是特定于平台的,如果在Windows x86中编译,则它将仅在Win…