web-dev-qa-db-ja.com

Java Joda-Timeで来月の最初の日

Joda-Timeorg.joda.timeパッケージを使用して、来月の最初の日を返す以下のメソッドをどのように書き換えますか?

public static Date firstDayOfNextMonth() {
    Calendar nowCal = Calendar.getInstance();
    int month = nowCal.get(Calendar.MONTH) + 1;
    int year = nowCal.get(Calendar.YEAR);

    Calendar cal = Calendar.getInstance();
    cal.clear();
    cal.set(Calendar.YEAR, year);
    cal.set(Calendar.MONTH, month);
    cal.set(Calendar.DAY_OF_MONTH, 1);
    Date dueDate = new Date(cal.getTimeInMillis());

    return dueDate;
}
40
Mat B.
   LocalDate today = new LocalDate();
   LocalDate d1 = today.plusMonths(1).withDayOfMonth(1);

少し簡単できれいですね。 :-)

更新:日付を返したい場合:

return new Date(d1.toDateTimeAtStartOfDay().getMillis());

しかし、純粋なDATE型(つまり、時刻情報のないカレンダーの1日)をDATETIME型と混合することは避けてください。特に恐ろしいJava.util.Date。整数型と浮動小数点型の変換に似ているため、注意が必要です。

45
leonbloy

私はあなたがDateオブジェクトを返したいと思っているので:

public static Date firstDayOfNextMonth() {
    MutableDateTime mdt = new MutableDateTime();
    mdt.addMonths(1);
    mdt.setDayOfMonth(1);
    mdt.setMillisOfDay(0); // if you want to make sure you're at midnight
    return mdt.toDate();
}
21
delfuego

ジョーダタイム

Joda-Time 2.3を使用して、この問題について説明します。

不変

通常、Joda-Timeクラスの immutable バージョンを使用する必要があります。ほとんどすべてのメソッドは、既存のインスタンスを変更するのではなく、 DateTime の新しいインスタンスを返します。物事を簡素化し、自動スレッドセーフを実現します。

一日の始まり

時刻をゼロに設定するのではなく、新しいメソッド withTimeAtStartOfDay() を使用します。夏時間(DST)およびその他の異常のため、一部のタイムゾーンの一部の日には、午前0時または00:00:00の時刻がありません。

変換:j.u.Date↔DateTime

Joda-Time DateTimeインスタンスを Java.util.Date インスタンスに変換するには、単に toDate メソッドを呼び出します。日付のコンストラクタは不要です。

逆に言えば、Java.util.Dateがあり、Joda-Time DateTimeが必要な場合は、目的の DateTimeZone オブジェクトとともにDateをDateTimeのコンストラクターに渡すだけです。

サンプルコード

DateTimeZone timeZone = DateTimeZone.forID( "Europe/Paris" );
// Usually better to specify a time zone rather than rely on default.
DateTime now = new DateTime( timeZone ); // Or, for default time zone: new DateTime()
DateTime monthFromNow = now.plusMonths(1);
DateTime firstOfNextMonth = monthFromNow.dayOfMonth().withMinimumValue();
DateTime firstMomentOfFirstOfNextMonth = firstOfNextMonth.withTimeAtStartOfDay();

または、あなたがマニアである場合、1行のコードですべてを一緒にストリングします。

DateTime allInOneLine = new DateTime( DateTimeZone.forID( "Europe/Paris" ) ).plusMonths( 1 ).dayOfMonth().withMinimumValue().withTimeAtStartOfDay();

他のクラス/ライブラリとの対話のために、古いJava.util.Dateに翻訳します。

Java.util.Date date = firstMomentOfFirstOfNextMonth.toDate();

コンソールにダンプ…

System.out.println( "now: " + now );
System.out.println( "monthFromNow: " + monthFromNow );
System.out.println( "firstOfNextMonth: " + firstOfNextMonth );
System.out.println( "firstMomentOfFirstOfNextMonth: " + firstMomentOfFirstOfNextMonth );
System.out.println( "allInOneLine: " + allInOneLine );
System.out.println( "date: " + date );

実行すると…

now: 2014-01-21T02:46:16.834+01:00
monthFromNow: 2014-02-21T02:46:16.834+01:00
firstOfNextMonth: 2014-02-01T02:46:16.834+01:00
firstMomentOfFirstOfNextMonth: 2014-02-01T00:00:00.000+01:00
allInOneLine: 2014-02-01T00:00:00.000+01:00
date: Fri Jan 31 15:00:00 PST 2014

Java.time

Java.time フレームワークは、Java 8以降に組み込まれています。古いJava.util.Date/.Calendarクラスに取って代わります。Joda-Timeに触発され、後継者。

これらの新しいクラスにはTemporalAdjusterインターフェイス( Tutorial )と TemporalAdjusters (複数のsに注意)の実装が含まれます。必要なアジャスターだけが必要になる: firstDayOfNextMonth

ZoneId zoneId = ZoneId.of ( "America/Montreal" );
LocalDate today = LocalDate.now ( zoneId );
LocalDate firstOfNextMonth = today.with ( TemporalAdjusters.firstDayOfNextMonth () );

コンソールにダンプします。

System.out.println ( "today: " + today + "  |  firstOfNextMonth: " + firstOfNextMonth );

今日:2015-12-22 | firstOfNextMonth:2016-01-01

日付のみではなく日時を使用する場合は、調整します。

ZonedDateTime zdt = firstOfNextMonth.atStartOfDay( zoneId );

まだJava.timeに更新されていない古いクラスを操作するために古いJava.util.Dateを使用する必要がある場合は、ZonedDateTimeオブジェクトから抽出された Instant から変換します。インスタントは、UTCのタイムライン上の瞬間です。

Java.util.Date date = Java.util.Date.from( zdt.toInstant() );

Java.timeについて

Java.time フレームワークはJava 8以降に組み込まれています。これらのクラスは厄介な古いものに取って代わります legacyJava.util.DateCalendar 、& SimpleDateFormat などの日時クラス。

Joda-Time プロジェクトは、現在 メンテナンスモード であり、 Java.time への移行を推奨しています=クラス。

詳細については、 Oracle Tutorial を参照してください。また、Stack Overflowで多くの例と説明を検索してください。指定は JSR 31 です。

Java.timeオブジェクトをデータベースと直接交換できます。 JDBC driverJDBC 4.2 以降に準拠して使用します。文字列も、Java.sql.*クラスも必要ありません。

Java.timeクラスはどこで入手できますか?

ThreeTen-Extra プロジェクトは、追加のクラスでJava.timeを拡張します。このプロジェクトは、Java.timeに将来追加される可能性のある証明の場です。 IntervalYearWeekYearQuarter 、および-などの便利なクラスがあります。 more

15
Basil Bourque

joda APIにはそのためのメソッドがあります。

Date date = new LocalDate().plusMonths(1).dayOfMonth().withMinimumValue().toDate();

それが役に立てば幸い!

6
avaz

前と同じですが、Java.util.Dateにも変換されます

日付firstDayOfNextMonth =(new LocalDate()。plusMonths(1).withDayOfMonth(1))。toDate();

2
simonC

localDate = new LocalDate()。plusMonths(1).withDayOfMonth(1);

1
Tomasz Krzyżak

私は「私」が正しい質問を得るかどうかはわかりませんが、ここに私の試みがあります:D .. +1ヶ月を追加しないでください?

public static Date firstDayOfNextMonth() {
        LocalDateTime now = LocalDateTime.now();
        int year = now.getYear();
        int month = now.getMonthValue();
        int day = now.getDayOfMonth();  

        Calendar cal = Calendar.getInstance();
        cal.clear();
        cal.set(Calendar.YEAR, year);
        cal.set(Calendar.MONTH, month);
        cal.set(Calendar.DAY_OF_MONTH, 1);

        Date dueDate = new Date(cal.getTimeInMillis());

    return dueDate;
}
0
BaajiRao