【问题标题】:Java Time between Date and Now日期和现在之间的 Java 时间
【发布时间】:2011-09-03 17:29:39
【问题描述】:

我需要帮助用 Java 编写一个函数,该函数接受输入日期并告诉我自该日期以来的年数、月数和天数。

例如,“2005 年 7 月 1 日”将输出“6 年 2 个月 2 天”

【问题讨论】:

  • 你有尝试过吗?你在挣扎什么?你用伪代码写出来了吗?
  • 你会看到很多优秀的库已经实现了这种类型的功能,例如joda-time
  • 基于什么?你说的是 6 年,但基准日期是多少?
  • @Braveyard - 标题中写着“在日期和现在之间”
  • @Richard - 欢迎来到 Stack Overflow。这不是一个“为我做我的工作”的网站。您将需要实际进行一些研究,尝试自己解决问题,然后在这里询问您是否遇到困难并需要具体帮助。届时人们将非常愿意提供帮助。

标签: java date time


【解决方案1】:

使用Joda Time - 它相对容易:

import org.joda.time.*;

public class Test
{
    public static void main(String[] args)
    {
        LocalDate then = new LocalDate(2005, 7, 1);
        LocalDate today = new LocalDate();

        Period period = new Period(then, today, PeriodType.yearMonthDay());
        System.out.println(period); // P6Y2M2D
        System.out.println(period.getYears()); // 6
        System.out.println(period.getMonths()); // 2
        System.out.println(period.getDays()); //2
    }
}

(我非常更喜欢 Joda API 而不是 Date/Calendar。它更容易使用,部分原因是通常更喜欢不变性。)

【讨论】:

  • Joda-Time 是否支持 Java 版本 1.4.2?
  • @Kit:您可能需要找到 1.x 版本 - 2.0 使用泛型等,所以我相信需要 Java 1.5 或更高版本。
  • 为了更简单,请查看PeriodFormatterBuilder 类。例如,打印年份和月份的格式化程序,例如“15 年零 8 个月”,可以构造如下:PeriodFormatter yearsAndMonths = new PeriodFormatterBuilder() .printZeroAlways() .appendYears() .appendSuffix(" year", " years") .appendSeparator(" and ") .printZeroRarelyLast() .appendMonths() .appendSuffix(" month", " months") .toFormatter();
【解决方案2】:

java.time

以下引用来自home page of Joda-Time的通知:

请注意,从 Java SE 8 开始,用户被要求迁移到 java.time (JSR-310) - JDK 的核心部分,它取代了这个项目。

您可以使用java.time.Period,它以ISO-8601 standards 为蓝本,并作为JSR-310 implementation 的一部分引入Java-8

使用现代日期时间 API java.time 的解决方案:

import java.time.LocalDate;
import java.time.Period;

public class Main {
    public static void main(String[] args) {
        LocalDate startDate = LocalDate.of(2005, 7, 1);
        LocalDate endDate = LocalDate.of(2011, 9, 3);
        Period period = startDate.until(endDate);
        System.out.println(period);

        // Custom format
        String formatted = String.format("%d years, %d months, %d days", period.getYears(), period.getMonths(),
                period.getDays());
        System.out.println(formatted);
    }
}

输出:

P6Y2M2D
6 years, 2 months, 2 days

ONLINE DEMO

通过 Trail: Date Time 了解有关现代日期时间 API 的更多信息。


* 出于任何原因,如果您必须坚持使用 Java 6 或 Java 7,您可以使用 ThreeTen-Backport,它将大部分 java.time 功能向后移植到 Java 6 和 7 . 如果您正在为一个 Android 项目工作并且您的 Android API 级别仍然不符合 Java-8,请检查 Java 8+ APIs available through desugaringHow to use ThreeTenABP in Android Project

【讨论】:

    猜你喜欢
    • 2023-01-25
    • 1970-01-01
    • 2012-06-26
    • 2020-10-19
    • 2020-08-21
    • 1970-01-01
    • 2012-05-27
    • 1970-01-01
    • 2011-08-10
    相关资源
    最近更新 更多