我的API允许客户端库通过日期:
method(java.util.Date date)
与Joda-Time工作,从这个日期我想提取月份和遍历所有天本月包含。
现在,通过日期通常是新的Date() - 这意味着当前时刻。我的问题实际上是在设置新DateMidnight(jdkDate)实例是在每月的开始。
可能有人请演示了该用例Joda-Time?
午夜在当月的第一天开始计算公式如下:
// first midnight in this month
DateMidnight first = new DateMidnight().withDayOfMonth(1);
// last midnight in this month
DateMidnight last = first.plusMonths(1).minusDays(1);
如果从java.util.Date开始,不同的DateMidnight构造函数用于:
// first midnight in java.util.Date's month
DateMidnight first = new DateMidnight( date ).withDayOfMonth(1);
乔达时间Java文档 - https://www.joda.org/joda-time/apidocs/overview-summary.html
另一种方式(不考虑DateMidnight考虑),以获得该月的第一天是使用:
DateTime firstDayOfMonth = new DateTime().dayOfMonth().withMinimumValue();
该answer by ngeek是正确的,但不能把时间以当天的第一刻。要调整时间,追加调用withTimeAtStartOfDay
。
// © 2013 Basil Bourque. This source code may be used freely forever by anyone taking full responsibility for doing so.
org.joda.time.DateTime startOfThisMonth = new org.joda.time.DateTime().dayOfMonth().withMinimumValue().withTimeAtStartOfDay();
org.joda.time.DateTime startofNextMonth = startOfThisMonth.plusMonths( 1 ).dayOfMonth().withMinimumValue().withTimeAtStartOfDay();
System.out.println( "startOfThisMonth: " + startOfThisMonth );
System.out.println( "startofNextMonth: " + startofNextMonth );
当运行在西雅图的美国...
startOfThisMonth: 2013-11-01T00:00:00.000-07:00
startofNextMonth: 2013-12-01T00:00:00.000-08:00
注意在控制台输出的这两条线的差:-7 VS -8因为Daylight Saving Time的。
一般来说应该总是指定的时间段,而不是依赖于默认。这里为简单起见省略。之一应该添加这样的线,并通过时区目的是实施例中使用上述的构造函数。
// Time Zone list: http://joda-time.sourceforge.net/timezones.html (Possibly out-dated, read note on that page)
// UTC time zone (no offset) has a constant, so no need to construct: org.joda.time.DateTimeZone.UTC
org.joda.time.DateTimeZone kolkataTimeZone = org.joda.time.DateTimeZone.forID( "Asia/Kolkata" );
以上是正确的,但已经过时。该乔达时库现在被内置到Java 8和后来的java.time框架所取代。
该LocalDate
表示没有时间一天和不同时区的日期,唯一的价值。时区是至关重要的确定日期。对于任何给定时刻的日期由全球各地的区域不同而不同。
ZoneId zoneId = ZoneId.of( "America/Montreal" );
LocalDate today = LocalDate.now( zoneId );
使用TemporalAdjusters
的一个拿到第一个月的。
LocalDate firstOfMonth = today.with( TemporalAdjusters.firstDayOfMonth() );
该LocalDate
可以生成代表这一天的第一时刻ZonedDateTime
。
ZonedDateTime firstMomentOfCurrentMonth = firstOfMonth.atStartOfDay( zoneId );
哦,我没有看到,这是关于jodatime。无论如何:
Calendar c = Calendar.getInstance();
c.setTime(date);
c.set(Calendar.HOUR_OF_DAY, 0);
c.set(Calendar.MINUTE, 0);
c.set(Calendar.SECOND, 0);
c.set(Calendar.MILLISECOND, 0);
int min = c.getActualMinimum(Calendar.DAY_OF_MONTH);
int max = c.getActualMaximum(Calendar.DAY_OF_MONTH);
for (int i = min; i <= max; i++) {
c.set(Calendar.DAY_OF_MONTH, i);
System.out.println(c.getTime());
}
或使用公地郎咸平:
Date min = DateUtils.truncate(date, Calendar.MONTH);
Date max = DateUtils.addMonths(min, 1);
for (Date cur = min; cur.before(max); cur = DateUtils.addDays(cur, 1)) {
System.out.println(cur);
}
DateMidnight
现在已经过时。相反,你可以这样做:
LocalDate firstOfMonth = new LocalDate(date).withDayOfMonth(1);
LocalDate lastOfMonth = firstOfMonth.plusMonths(1).minusDays(1);
如果你知道的时区使用new LocalDate(date, timeZone)
而不是获得更高的精度。
你也可以做.dayOfMonth().withMinimumValue()
代替.withDayOfMonth(1)
的
编辑:
这会给你12/1/YYYY 00:00
和12/31/YYYY 00:00
。如果您而最后一个月的实际上是第下个月(因为你正在做的条款之间),然后从lastOfMonth计算取出minusDays(1)