Java LocalDateTime minusYears用于浮动年数

Java LocalDateTime minusYears用于浮动年数,java,datetime,floating-point,localdate,Java,Datetime,Floating Point,Localdate,Java LocalDateTimeminusYears需要较长的参数。如果我想减去浮动年数,例如2.5年,我该怎么做 有内置的支持吗 注意:我将值和单位作为用户的输入。上面的问题有点笼统(我在小时、年、周等方面也有同样的问题)。有时可能是2.7小时或2.8年或5.3周等您可以使用和方法来完成这项工作 例如: LocalDateTime dateTime = LocalDateTime.now(); LocalDateTime result = dateTime.minusYears(2).mi

Java LocalDateTime
minusYears
需要较长的参数。如果我想减去浮动年数,例如2.5年,我该怎么做

有内置的支持吗

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

您可以使用和方法来完成这项工作

例如:

LocalDateTime dateTime = LocalDateTime.now();
LocalDateTime result = dateTime.minusYears(2).minusMonths(6);
当你说“2.5”年时,我假设你是指“两年半”,而不是“两年零五个月”,但如果需要,你可以纠正这一点。

你可以使用和方法来完成这项工作

例如:

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

当你说“2.5”年时,我假设你的意思是“两年半”,而不是“两年零五个月”,但是的,如果需要的话,你可以纠正它。

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

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)
等函数来处理该问题。

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

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)
等函数来处理该问题。

关于:

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;
}
那么:

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;
}

您没有任何内置支持,但您可以通过将
值转换为月份(
*12
)轻松做到这一点:

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

public static LocalDateTime removeYear(LocalDateTime dateTime, float year) {
    int monthToRemove = (int)(year * 12);
    return dateTime.minusMonths(monthToRemove);
}
通过以下方式进行测试:

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
)的零或某些小数部分,例如
0.5

您没有任何内置支持,但您可以通过将
值转换为月份(
*12
)来轻松做到这一点:

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

public static LocalDateTime removeYear(LocalDateTime dateTime, float year) {
    int monthToRemove = (int)(year * 12);
    return dateTime.minusMonths(monthToRemove);
}
通过以下方式进行测试:

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
)的零或某些小数部分,例如
0.5

使用最小年数(2)。最小月数(6)。@哇:谢谢!我得到这些值作为输入。2.5(2年零6个月)很简单,但如果有人给出2.7或2.8,我觉得手动转换会很麻烦。问题是,你如何区分输入,例如用户输入2.7小时、2.8年或5.3周?@YCF_L:我能理解。我得到了日期、浮点值和单位作为输入,输入时间为年(2)。月(6)。@Wow:谢谢!我得到这些值作为输入。2.5(2年零6个月)很简单,但如果有人给出2.7或2.8,我觉得手动转换会很麻烦。问题是,你如何区分输入,例如用户输入2.7小时、2.8年或5.3周?@YCF_L:我能理解。我得到日期,浮动值和单位作为输入!我得到这些值作为输入。2.5(2年零6个月)很简单,但如果有人给出2.7或2.8,我觉得手动转换会很麻烦。谢谢!我得到这些值作为输入。2.5(2年零6个月)是一个简单的例子,但如果有人给出2.7或2.8,我觉得手动转换会很麻烦。谢谢你的代码!实际上我把值和单位都作为输入。上述问题有点笼统。有时可能是2.7小时、2.8年或5.3周等。@Abhinav您可以相应地处理这些情况,使用minusWeeks、minusHours等函数,我不会为您写出所有内容。几个小时,你必须使用LocalDateTime。谢谢!如果没有其他选择,那么我将为所有人编写类似的代码function@Abhinav是的,我不能再提其他建议了。谢谢你的密码!实际上我把值和单位都作为输入。上述问题有点笼统。有时可能是2.7小时、2.8年或5.3周等。@Abhinav您可以相应地处理这些情况,使用minusWeeks、minusHours等函数,我不会为您写出所有内容。几个小时,你必须使用LocalDateTime。谢谢!如果