【问题标题】:How do I obtain the number of days within a given month using Joda-Time?如何使用 Joda-Time 获取给定月份内的天数?
【发布时间】:2011-04-15 22:27:07
【问题描述】:
30 days hath September,
   April, June and November,
 All the rest have 31,
   Excepting February alone
(And that has 28 days clear,
   With 29 in each leap year).

我可以按回文法获得此信息吗? (当然,我指的不是诗)

【问题讨论】:

  • 嗯... anagrammatically, or programmatically?

标签: java datetime jodatime


【解决方案1】:

如果您有一个代表月份值的DateTime 对象,那么它非常简单。您从该 DateTime 对象中获取 dayOfMonth 属性并获取该属性的最大值。这是一个示例函数:

public static int daysOfMonth(int year, int month) {
  DateTime dateTime = new DateTime(year, month, 14, 12, 0, 0, 000);
  return dateTime.dayOfMonth().getMaximumValue();
}

【讨论】:

  • 这对我不起作用。 getMaximumValue() 为 11 月返回 31,这当然是不正确的。
  • @ChrisGerken:也许你的月份是零索引的?对于 JODA,月份应该是 1-12 之间的值。如果您在 11 月使用 10,JODA 会将其视为 10 月并返回 31。
  • 我几乎所有与日期相关的错误都是因为 JODA 不是零索引的。很难记住!
【解决方案2】:

是的,虽然它没有想象中的那么漂亮:

import org.joda.time.*;
import org.joda.time.chrono.*;
import org.joda.time.field.*;

public class Test {
    public static void main(String[] args) {
        GregorianChronology calendar = GregorianChronology.getInstance();
        DateTimeField field = calendar.dayOfMonth();

        for (int i = 1; i < 12; i++) {
            LocalDate date = new LocalDate(2010, i, 1, calendar);
            System.out.println(field.getMaximumValue(date));
        }
    }
}

请注意,我已经硬编码假设有 12 个月,并且我们对 2010 年感兴趣。我明确选择了公历年表 - 在其他年表中你d 得到不同的答案,当然。 (而且“12 个月”循环也不是一个有效的假设......)

为了获取值,我选择了LocalDate 而不是DateTime,以强调(尽管很微弱:)该值不依赖于时区。

请注意,这仍然不像看起来那么简单。我不知道如果使用一个年表来构造LocalDate 会发生什么,但要求在不同年表中的字段的最大值。我对可能会发生什么有一些想法,对 Joda Time 有一定的了解,但这可能不是一个好主意 :)

【讨论】:

    【解决方案3】:
    Calendar cal = Calendar.getInstance();
    cal.set(Calendar.MONTH, yourMonth);
    cal.set(Calendar.YEAR, yourYear);
    cal.getActualMaximum(Calendar.DAY_OF_MONTH); // <-- the result!
    

    【讨论】:

    • 那不是 Jodatime。 OP 明确要求这样做。
    • 欧普斯。确切的……我重点是问题,忘记标题了……但是如果用标准的API可以很容易地得到结果,那么像JodaTime这样的外部API就没有用了。
    • 我个人会很好远离 java.util.Calendar。 Joda Time 是一个非常优秀的 API。例如,如果您将其设置为 2 月,此时 getInstance 返回 9 月 31 日,您对它的作用有多大信心?哦,别忘了二月是第一个月……
    • 我听说过外部 API,但 Java 的 Calendar 包是一个已知的责任。 Joda 顺利滑入。
    【解决方案4】:

    这是另一个简单的函数:

    int daysOfMonth(DateTime dt) {
        int month = dt.getMonthOfYear();
        int month2 = month;
        int days = dt.getDay();
        DateTime dt2 = dt;
        while (month == month2 ) {
           days++;
           dt2.addDays(1);
           month2 = dt2.getMonthOfYear();
        }
        return (days - 1);
    }
    

    【讨论】:

      猜你喜欢
      • 2017-09-21
      • 2011-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-07
      • 2011-11-24
      相关资源
      最近更新 更多