Java LocalDateTime minusYears
需要很长的参数。万一,如果我想减去年份的浮动数。 2.5年,我该怎么办?
有内置支持吗?
注意:我将值和单位都作为用户的输入。上面的问题有点笼统(关于小时,年,周等,我也有同样的问题)。有时可能是2.7小时或2.8年或5.3周等
答案 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)
您可以同时使用minusYears和minusMonth方法来完成这项工作。
示例:
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)
等功能可以处理该问题。