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.");