34

私のAPIを使用すると、ライブラリクライアントは日付を渡すことができます。

method(java.util.Date date)

Joda -Timeを使用して、この日付から月を抽出し、今月に含まれるすべての日を繰り返し処理したいと思います。

現在、渡された日付は通常new Date()であり、現在の瞬間を意味します。私の問題は、実際には、新しいDateMidnight(jdkDate)インスタンスを月の初めに設定することです。

誰かがJoda-Timeでこのユースケースをデモンストレーションしてくれませんか?

4

6 に答える 6

47

今月の初日の真夜中は次のように与えられます。

// 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 javadoc- https://www.joda.org/joda-time/apidocs/overview-summary.html

于 2010-02-14T15:22:19.220 に答える
33

月の最初の日を取得する別の方法(DateMidnightを考慮しない)は、次を使用することです。

  DateTime firstDayOfMonth = new DateTime().dayOfMonth().withMinimumValue();
于 2011-04-27T13:49:10.503 に答える
10

その日の最初の瞬間

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

米国シアトルで実行する場合…</p>

startOfThisMonth: 2013-11-01T00:00:00.000-07:00
startofNextMonth: 2013-12-01T00:00:00.000-08:00

これらの2行のコンソール出力の違いに注意してください。夏時間のために-7と-8です。


通常、デフォルトに依存するのではなく、常にタイムゾーンを指定する必要があります。簡単にするために、ここでは省略しています。このような行を追加し、上記の例で使用されているコンストラクターにタイムゾーンオブジェクトを渡す必要があります。

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

上記は正しいですが、時代遅れです。Joda-Timeライブラリは、Java8以降に組み込まれた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 );
于 2013-11-25T23:59:11.203 に答える
5

ああ、これが冗談だと​​は思わなかった。ともかく:

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 &lt;= 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);
}

于 2010-02-14T15:58:49.223 に答える
1

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。月の最後が実際には翌月の最初である場合(between句を実行しているため)、minusDays(1)lastOfMonthの計算からtheを削除します。

于 2014-10-09T21:32:30.917 に答える
0

これを使用して、月の開始日と終了日を取得できます。

DateTime monthStartDate = new DateTime().dayOfMonth().withMinimumValue();
DateTime monthEndDate = new DateTime().dayOfMonth().withMaximumValue();
                        
于 2020-08-20T12:12:04.443 に答える