我的API允许库客户端传递日期:
method(java.util.Date date)
使用Joda-Time,从这一天开始,我想提取月份并迭代本月所有日子。
现在,传递的日期通常是 new Date() - 意味着当前的瞬间。我的问题实际上是将新的 DateMidnight(jdkDate)实例设置为月初。
有人可以用Joda-Time演示此用例吗?
答案 0 :(得分:43)
当月第一天开始的午夜时间为:
// 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);
Joda Time java doc - https://www.joda.org/joda-time/apidocs/overview-summary.html
答案 1 :(得分:31)
另一种方法(不考虑DateMidnight)来获得该月的第一天将是:
DateTime firstDayOfMonth = new DateTime().dayOfMonth().withMinimumValue();
答案 2 :(得分:8)
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" );
以上是正确但过时的。 Joda-Time库现在被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 );
答案 3 :(得分:5)
哦,我没有看到这是关于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());
}
或者使用commons-lang:
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);
}
答案 4 :(得分:0)
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)
答案 5 :(得分:0)
您可以使用以下方法获取月份的开始日期和结束日期:
DateTime monthStartDate = new DateTime().dayOfMonth().withMinimumValue();
DateTime monthEndDate = new DateTime().dayOfMonth().withMaximumValue();