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).
我可以获得这些信息吗? (我说的不是这首诗,当然)如何使用Joda-Time获得给定月份内的天数?
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).
我可以获得这些信息吗? (我说的不是这首诗,当然)如何使用Joda-Time获得给定月份内的天数?
如果你有一个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,这当然是不正确的。 – 2013-11-18 20:02:45
@ChrisGerken:也许你的月份是零索引的?对于JODA,月份应该是1-12的值。如果您在十一月份使用了10,那么JODA会将其视为10月并返回31. – 2013-12-26 19:18:11
几乎所有与日期相关的错误都是因为JODA不是零索引。这很难记住! – 2015-10-20 03:17:18
Calendar cal = Calendar.getInstance();
cal.set(Calendar.MONTH, yourMonth);
cal.set(Calendar.YEAR, yourYear);
cal.getActualMaximum(Calendar.DAY_OF_MONTH); // <-- the result!
这不是乔达泰。 OP明确要求这一点。 – BalusC 2010-09-22 19:46:00
Oups。确切的...我专注于这个问题并忘记了标题......但是如果使用标准API可以轻松获得结果,那么像JodaTime这样的外部API是无用的。 – 2010-09-22 20:03:56
我会亲自*离开java.util.Calendar。乔达时间是一个非常优秀的API。例如,如果您在getInstance返回9月31日时将它设置为2月,那么您将对此有多大信心?噢,别忘了2月是第1个月...... – 2010-09-22 20:20:53
是的,虽然它不是漂亮,因为它可能是:
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年感兴趣。我已经明确选择了格里高利年表 - 但在其他年表中,您会得到不同的答案,当然。 (而且“12个月”循环也不是有效的假设......)
我已经去了LocalDate
而不是DateTime
为了获取值,强调(但是微弱地):)该值不取决于时区。
这还不如看起来那么简单,介意你。我不知道如果使用一个年表来构造LocalDate
会发生什么情况,但要求在不同的年表中获得最大值。我有什么威力发生,寂寂约达时间一定量的一些想法,但它可能不是一个好主意:)
这里是另一个简单的函数:
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);
}
嗯... anagramatically,或编程? – Lambart 2017-06-05 20:39:34