Java LocalDateTime减去年份的浮动年数

时间:2018-07-31 14:16:22

标签: java datetime floating-point localdate

Java LocalDateTime minusYears需要很长的参数。万一,如果我想减去年份的浮动数。 2.5年,我该怎么办?

有内置支持吗?

注意:我将值和单位都作为用户的输入。上面的问题有点笼统(关于小时,年,周等,我也有同样的问题)。有时可能是2.7小时或2.8年或5.3周等

4 个答案:

答案 0 :(得分:1)

那:

double years = 2.5;
long months = (long) (years * 12);// 30 month
LocalDateTime ld = LocalDateTime.now();
ld = ld.minusMonths(months);

但是请注意,例如,如果您有以下情况,这可能会损失几天的时间:

years = 2.7
=>years * 12 > 32.400000000000006

所以在这里您可能会损失0.400000000000006个月。

因此,如果将其四舍五入,可能会更有用:

long months = Math.round(years * 12);

编辑:

根据您的评论:

  

实际上,我将值和单位都作为输入。上面的问题是   泛化点。有时可能是2.7小时或2.8年,或者   5.3周等

我认为您需要这样的东西:

但是要小心几个月

public static LocalDateTime changeDate(LocalDateTime date, float time, String unit) {
    long newTime;
    switch (unit) {
        case ("hour"):
            newTime = Math.round(time * 60);
            date = date.minusMinutes(newTime);// If hours then subtract minutes
            break;
        case ("day"):
            newTime = Math.round(time * 24);
            date = date.minusHours(newTime);// If days then subtract hours
            break;
        case ("week"):
            newTime = Math.round(time * 7);
            date = date.minusDays(newTime);// If week then subtract days
            break;
        case ("month"):
            newTime = Math.round(time * 30);// here You have to check again
            date = date.minusDays(newTime);// If month then subtract days
            break;
        case ("year"):
            newTime = Math.round(time * 12);
            date = date.minusMonths(newTime);// If days then subtract months
            break;
        default:
            break;
    }
    return date;
}

答案 1 :(得分:1)

您对此没有任何内置支持,但是您可以通过将year值转换为月份(* 12)来轻松实现:

float year = 2.5F;
LocalDateTime dateTime = dateTime.minusMonths((int)(year * 12);

如果需要,您还可以创建util方法:

public static LocalDateTime removeYear(LocalDateTime dateTime, float year) {
    int monthToRemove = (int)(year * 12);
    return dateTime.minusMonths(monthToRemove);
}

通过:: p进行测试

public static void main(String[] args) {
    LocalDateTime date = removeYear(LocalDateTime.now(), 2.5F);
    System.out.println(date);
}

输出:

  

2016-01-31T16:33:26.755

请注意,要使该方法更健壮,可以检查year表示一个浮点数,该浮点数仅接受某些类型的值,例如小数部分(2.0)的零或某些小数部分,例如{ {1}}。

答案 2 :(得分:0)

您可以同时使用minusYearsminusMonth方法来完成这项工作。

示例:

LocalDateTime dateTime = LocalDateTime.now();
LocalDateTime result = dateTime.minusYears(2).minusMonths(6);

当您说“ 2.5”年时,我假设您的意思是“两年半”,而不是“两年零五个月”,但是,是的,您可以根据需要进行更正。

答案 3 :(得分:0)

没有内置的支持,但是如果您想牺牲精度,可以这样做:

public static void main(String[] args) {
    LocalDate ld = LocalDate.of(2015, 12, 1);
    System.out.println(minusFpYears(ld, 2.5f));
}
static LocalDate minusFpYears(LocalDate ld, float fpyears) {
    float fpmonths = fpyears % 1;
    long years = (long)(fpyears - fpmonths);
    long months = (long)(12L * fpmonths);
    return ld.minusYears(years).minusMonths(months);
}
  

感谢您的代码!实际上,我将值和单位都作为输入。的   上述问题有点笼统。有时可能是2.7小时   或2.8年或5.3周等。

使LocalDate minusFpWeeks(LocalDate ld, float fpweeks)LocalDateTime minusFpHours(LocalDateTime ld, float fphours)等功能可以处理该问题。