在乔达,时间,日期时间设置开始的一个月

问题描述 投票:29回答:5

我的API允许客户端库通过日期:

method(java.util.Date date)

Joda-Time工作,从这个日期我想提取月份和遍历所有天本月包含。

现在,通过日期通常是新的Date() - 这意味着当前时刻。我的问题实际上是在设置新DateMidnight(jdkDate)实例是在每月的开始。

可能有人请演示了该用例Joda-Time

java date jodatime
5个回答
45
投票

午夜在当月的第一天开始计算公式如下:

// 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


31
投票

另一种方式(不考虑DateMidnight考虑),以获得该月的第一天是使用:

  DateTime firstDayOfMonth = new DateTime().dayOfMonth().withMinimumValue();

8
投票

First Moment Of The Day

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.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 );

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());
}

或使用公地郎咸平:

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);
}


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:0012/31/YYYY 00:00。如果您而最后一个月的实际上是第下个月(因为你正在做的条款之间),然后从lastOfMonth计算取出minusDays(1)

© www.soinside.com 2019 - 2024. All rights reserved.