Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java8:两个LocalDateTime在多个单位中的差异_Java_Date_Datetime_Java 8_Difference - Fatal编程技术网

Java8:两个LocalDateTime在多个单位中的差异

Java8:两个LocalDateTime在多个单位中的差异,java,date,datetime,java-8,difference,Java,Date,Datetime,Java 8,Difference,我试图计算两个LocalDateTime之间的差异 输出的格式必须为y年m月d天h小时m分s秒。以下是我写的: import java.time.Duration; import java.time.Instant; import java.time.LocalDateTime; import java.time.Period; import java.time.ZoneId; public class Main { static final int MINUTES_PER_HOUR

我试图计算两个
LocalDateTime
之间的差异

输出的格式必须为
y年m月d天h小时m分s秒
。以下是我写的:

import java.time.Duration;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.Period;
import java.time.ZoneId;

public class Main {

    static final int MINUTES_PER_HOUR = 60;
    static final int SECONDS_PER_MINUTE = 60;
    static final int SECONDS_PER_HOUR = SECONDS_PER_MINUTE * MINUTES_PER_HOUR;

    public static void main(String[] args) {
        LocalDateTime toDateTime = LocalDateTime.of(2014, 9, 9, 19, 46, 45);
        LocalDateTime fromDateTime = LocalDateTime.of(1984, 12, 16, 7, 45, 55);

        Period period = getPeriod(fromDateTime, toDateTime);
        long time[] = getTime(fromDateTime, toDateTime);

        System.out.println(period.getYears() + " years " + 
                period.getMonths() + " months " + 
                period.getDays() + " days " +
                time[0] + " hours " +
                time[1] + " minutes " +
                time[2] + " seconds.");


    }

    private static Period getPeriod(LocalDateTime dob, LocalDateTime now) {
        return Period.between(dob.toLocalDate(), now.toLocalDate());
    }

    private static long[] getTime(LocalDateTime dob, LocalDateTime now) {
        LocalDateTime today = LocalDateTime.of(now.getYear(),
                now.getMonthValue(), now.getDayOfMonth(), dob.getHour(), dob.getMinute(), dob.getSecond());
        Duration duration = Duration.between(today, now);

        long seconds = duration.getSeconds();

        long hours = seconds / SECONDS_PER_HOUR;
        long minutes = ((seconds % SECONDS_PER_HOUR) / SECONDS_PER_MINUTE);
        long secs = (seconds % SECONDS_PER_MINUTE);

        return new long[]{hours, minutes, secs};
    }
}
我得到的结果是29年8个月24天12小时0分50秒。我已经检查了我的结果(使用值
12/16/1984 07:45:55
09/09/2014 19:46:45
)。以下屏幕截图显示了输出:

我很确定我的代码中月值之后的字段是错误的。任何建议都会很有帮助

更新 我在另一个网站上测试了我的结果,结果不一样。这是:(结果:29年8个月24天12小时0分50秒)

更新 由于我从两个不同的站点得到了两个不同的结果,我想知道我的计算算法是否合法。如果我使用以下两个
LocalDateTime
对象:

LocalDateTime toDateTime = LocalDateTime.of(2014, 9, 10, 6, 40, 45);
LocalDateTime fromDateTime = LocalDateTime.of(1984, 12, 16, 7, 45, 55);
然后输出就来了:
29年8个月25天-1小时-5分钟-10秒。

从这个角度来看,它应该是29年8个月24天22小时54分50秒。所以算法也需要处理负数


请注意,问题不在于哪个站点给出了什么结果,我需要知道正确的算法并获得正确的结果。

不幸的是,似乎没有跨越时间的句点类,因此您可能需要自己进行计算

long minutes = ChronoUnit.MINUTES.between(fromDate, toDate);
long hours = ChronoUnit.HOURS.between(fromDate, toDate);
幸运的是,date和time类有很多实用方法,可以在一定程度上简化它。这里有一种计算差异的方法,虽然不一定是最快的:

LocalDateTime fromDateTime=LocalDateTime.of(1984,12,16,7,45,55);
LocalDateTime toDateTime=LocalDateTime.of(2014,9,10,6,40,45);
LocalDateTime tempDateTime=LocalDateTime.from(fromDateTime);
长年=tempDateTime.until(toDateTime,ChronoUnit.years);
tempDateTime=tempDateTime.plusYears(年);
长月份=tempDateTime.until(toDateTime,ChronoUnit.months);
tempDateTime=tempDateTime.plusMonths(月);
长天数=tempDateTime.until(toDateTime,ChronoUnit.days);
tempDateTime=tempDateTime.plusDays(天);
长时间=tempDateTime.until(toDateTime,ChronoUnit.hours);
tempDateTime=tempDateTime.plusHours(小时);
长分钟=tempDateTime.until(toDateTime,ChronoUnit.minutes);
tempDateTime=tempDateTime.plusMinutes(分钟);
long seconds=tempDateTime.until(toDateTime,ChronoUnit.seconds);
系统输出打印项次(年数+“年数”+
月数+“月数”+
天+天+
小时数+“小时数”+
分钟+“分钟”+
秒+“秒”);
//打印:29年8个月24天22小时54分50秒。
其基本思想是:创建一个临时的开始日期,并将整个年份设置为结束日期。然后根据年数调整该日期,使开始日期距离结束日期不到一年。按降序为每个时间单位重复该步骤


最后是免责声明:我没有考虑不同的时区(两个日期应该在同一时区),也没有测试/检查夏时制或日历中的其他更改(如萨摩亚的时区更改)如何影响此计算。所以要小心使用。

我发现最好的方法是使用ChronoUnit。

long minutes = ChronoUnit.MINUTES.between(fromDate, toDate);
long hours = ChronoUnit.HOURS.between(fromDate, toDate);

附加文档在这里:

Tapas Bose代码和Thomas代码存在一些问题。如果时差为负值,则数组获取负值。例如,如果

LocalDateTime-toDateTime=LocalDateTime.of(2014,9,10,6,46,45);
LocalDateTime fromDateTime=LocalDateTime.of(2014,9,9,7,46,45);
它返回0年0月1天-1小时0分0秒

我认为正确的输出是:0年0月0天23小时0分0秒

我建议将LocalDate和LocalTime实例上的LocalDateTime实例分开。之后,我们可以获得Java8周期和持续时间实例。持续时间实例按天数和全天时间值(<24小时)分开,随后对时段值进行校正。当第二个LocalTime值在第一个LocalTime值之前时,需要将周期缩短一天

以下是我计算LocalDateTime差异的方法:

private void getChronoUnitForSecondAfterFirst(LocalDateTime firstLocalDateTime,LocalDateTime secondLocalDateTime,long[]chronoUnits){
/*在LocalDate和LocalTime上分开LocaldateTime*/
LocalDate firstLocalDate=firstLocalDateTime.toLocalDate();
LocalTime firstLocalTime=firstLocalDateTime.toLocalTime();
LocalDate secondLocalDate=secondLocalDateTime.toLocalDate();
LocalTime secondLocalTime=secondLocalDateTime.toLocalTime();
/*计算时差*/
Duration Duration=Duration.between(firstLocalDateTime,secondLocalDateTime);
long durationDays=duration.toDays();
Duration toughthedayDuration=Duration.minus天数(durationDays);
Logger.getLogger(PeriodDuration.class.getName()).log(Level.INFO,
持续时间是:“+Duration+”这是“+durationDays”
+“天和”+“整天持续时间”+“时间”);
Period Period=Period.between(firstLocalDate,secondLocalDate);
/*更正日期差异*/
if(secondLocalTime.isBefore(firstLocalTime)){
期间=期间。天数(1);
Logger.getLogger(PeriodDuration.class.getName()).log(Level.INFO,
“减1天”);
}
Logger.getLogger(PeriodDuration.class.getName()).log(Level.INFO,
“+firstLocalDateTime+”和”
+secondLocalDateTime+为:“+period+”,持续时间为:
+
import java.time.*;
import java.util.*;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;

public class MyClass {
public static void main(String args[]) {
    DateTimeFormatter T = DateTimeFormatter.ofPattern("dd/MM/yyyy HH:mm");
    Scanner h = new Scanner(System.in);

    System.out.print("Enter date of birth[dd/mm/yyyy hh:mm]: ");
    String b = h.nextLine();

    LocalDateTime bd = LocalDateTime.parse(b,T);
    LocalDateTime cd = LocalDateTime.now();

    long minutes = ChronoUnit.MINUTES.between(bd, cd);
    long hours = ChronoUnit.HOURS.between(bd, cd);

    System.out.print("Age is: "+hours+ " hours, or " +minutes+ " minutes old");
}
}
Duration.between(startLocalDateTime, endLocalDateTime).toMillis();
String.format("%d minutes %d seconds", 
  TimeUnit.MILLISECONDS.toMinutes(millis),
  TimeUnit.MILLISECONDS.toSeconds(millis) - 
  TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(millis)));
import org.joda.time.Days

LocalDate startDate = Something
LocalDate endDate = Something
// The difference would be exclusive of both dates, 
// so in most of use cases we may need to increment it by 1
Days.daysBetween(startDate, endDate).days
LocalDateTime fromDateTime = LocalDateTime.of(2014, 9, 9, 7, 46, 45);
LocalDateTime toDateTime = LocalDateTime.of(2014, 9, 10, 6, 46, 45);

Period period = Period.between(fromDateTime.toLocalDate(), toDateTime.toLocalDate());
Duration duration = Duration.between(fromDateTime.toLocalTime(), toDateTime.toLocalTime());

if (duration.isNegative()) {
    period = period.minusDays(1);
    duration = duration.plusDays(1);
}
long seconds = duration.getSeconds();
long hours = seconds / SECONDS_PER_HOUR;
long minutes = ((seconds % SECONDS_PER_HOUR) / SECONDS_PER_MINUTE);
long secs = (seconds % SECONDS_PER_MINUTE);
long time[] = {hours, minutes, secs};
System.out.println(period.getYears() + " years "
            + period.getMonths() + " months "
            + period.getDays() + " days "
            + time[0] + " hours "
            + time[1] + " minutes "
            + time[2] + " seconds.");