【问题标题】:Java LocalDateTime minusYears for floating number of yearsJava LocalDateTime minusYears 表示浮动年数
【发布时间】:2018-07-31 14:16:22
【问题描述】:

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

是否有任何内置支持?

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

【问题讨论】:

  • 使用 minusYears(2).minusMonths(6)。
  • @哇:谢谢!我将这些值作为输入。 2.5(2年6个月)很简单,但万一有人给2.7或2.8那我觉得手动转换会很麻烦。
  • 问题是,如何区分输入,例如如果用户输入 2.7 小时或 2.8 年或 5.3 周
  • @YCF_L:我能够弄清楚。我得到日期、浮点值和单位作为输入

标签: java datetime floating-point localdate


【解决方案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);
}

通过测试:

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】:

    怎么样:

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

    【讨论】:

    • 其实我把值和单位都作为输入。上面的问题有点笼统。有时可能是 2.7 小时或 2.8 年或 5.3 周等。
    • @Abhinav 从哪里获取数据?来自数据库?
    • 我的方法将日期、浮点值和单位作为输入
    • @YCF_L 这似乎是更简单的方法:)
    • 您应该将 String unit 替换为 ChronoUnit unit 并更新案例。我虽然更新了我的答案以使其更通用但不是现在:)
    【解决方案3】:

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

    示例:

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

    当您说“2.5”年时,我假设您的意思是“两年半”而不是“两年零 5 个月”,但是如果需要,您无论如何都可以更正它。

    【讨论】:

    • 谢谢!我将这些值作为输入。 2.5(2年6个月)很简单,但万一有人给2.7或2.8那我觉得手动转换会很麻烦。
    【解决方案4】:

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

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

    【讨论】:

    • 感谢代码!实际上,我将值和单位都作为输入。上面的问题有点笼统。有时可能是 2.7 小时或 2.8 年或 5.3 周等。
    • @Abhinav 您可以使用 minusWeeks、 minusHours 等函数相应地处理每种情况,我不会为您写出所有内容。几个小时,您必须使用 LocalDateTime。
    • 谢谢!如果没有其他选择,那么我将为所有功能编写类似的代码
    • @Abhinav 是的,我不能提出任何其他建议。
    猜你喜欢
    • 2016-04-03
    • 1970-01-01
    • 2020-12-20
    • 2011-05-31
    • 2021-11-26
    • 2015-06-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多