【问题标题】:Number of Days in a Month in java Date and LocalDateTimejava Date 和 LocalDateTime 中一个月的天数
【发布时间】:2017-09-05 08:44:14
【问题描述】:

对于 startDate 和 endDate 如下我如何确定以月和日为单位的时间段(剩下的时间):

String pattern = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'";
SimpleDateFormat format = new SimpleDateFormat(pattern);
Date start = format.parse("2016-11-09T02:00:00.000Z");
Date end = format.parse("2017-09-30T09:00:00.000Z");

因此我想要:10 个月零 22 天(结束日期)

【问题讨论】:

  • 简单除法问题end.getTime () - start.endTime () / seconds in days BUT 什么是一个月?几天?
  • 如果你的环境是Java 8,那么你可以考虑使用LocalDateTime,这是一个更好的java日期时间API。您可以使用 ChronoUnit 计算中间的天数、中间的小时数,甚至中间的月数
  • @KarelG 举个例子?

标签: java datetime jodatime


【解决方案1】:

如果可以使用Java 8,最好使用LocalDateTimePeriod

ZonedDateTime dateTime = ZonedDateTime.parse("2016-11-09T02:00:00.000Z");
ZonedDateTime end = ZonedDateTime.parse("2017-09-30T09:00:00.000Z");
System.out.println(Period.between(dateTime.toLocalDate(),end.toLocalDate())); 

结果是P10M21D 10 个月零 21 天

【讨论】:

  • 如果结束和开始之间的差异超过一年,则无法给出正确的月数。您需要按 12 * 年 + 月数计算月数。所以不要直接使用月份。
  • @nagendra547,我不太确定我是否理解你。 Period 应该显示正确的月数。 System.out.println(Period.between(LocalDate.parse("1987-10-05"),LocalDate.now())); 29 年零 11 个月。
  • 我认为@nagendra547 告诉我应该将29 年11 个月 返回为359 个月。但是 OP 没有指定当差异 >= 12 个月时应该是什么结果,所以两者都是正确的 IMO。
  • @Hugo,如果我们使用ChronoUnit而不是Period,则可以获得359个月:ChronoUnit.MONTHS.between(LocalDate.parse("1987-10-05"),LocalDate.now())
【解决方案2】:

此代码应该适合您。这是使用JODA Time 完成的。由于您也用 jodatime 标记了这个问题,所以我确信,您的项目中将包含 jodatime 所需的包。

String pattern = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'";
SimpleDateFormat format = new SimpleDateFormat(pattern);
Date start = format.parse("2016-11-09T02:00:00.000Z");
Date end = format.parse("2017-09-30T09:00:00.000Z");

LocalDate a = LocalDate.fromDateFields(start);
LocalDate b = LocalDate.fromDateFields(end);
Period p = new Period(a, b);
System.out.println("Months:  "+((p.getYears() * 12) + p.getMonths()));
System.out.println("Days: "+(p.getWeeks()*7+ p.getDays()));

但是,如果您使用的是 Java 8.0 或更高版本,则可以坚持使用 @Anton 建议的解决方案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-07
    相关资源
    最近更新 更多