web-dev-qa-db-ja.com

現在の週の月曜日の日付を取得する

月曜日から金曜日までの任意の日に実行されるユーティリティがあります。コンテンツ管理ツール内のいくつかのファイルを更新します。そのファイルに関連付けられている最終変更日は、その週の月曜日の日付でなければなりません。私は、今週の月曜日の日付を取得するために次のプログラムを作成しました。しかし、これがすべてのシナリオで機能するかどうかはまだわかりません。誰もがより良い解決策を持っていますか?

Calendar c = Calendar.getInstance();
c.setTime(new Date());
System.out.println(c.get(Calendar.DAY_OF_MONTH));
System.out.println(c.get(Calendar.DAY_OF_WEEK));
int mondayNo = c.get(Calendar.DAY_OF_MONTH)-c.get(Calendar.DAY_OF_WEEK)+2;
c.set(Calendar.DAY_OF_MONTH,mondayNo);
System.out.println("Date "+c.getTime());
24
Shashank Kadne

代わりに Joda Time を使用することを強くお勧めします(これだけでなく、すべての日付/時刻の作業に対して)。

// TODO: Consider time zones, calendars etc
LocalDate now = new LocalDate();
LocalDate monday = now.withDayOfWeek(DateTimeConstants.MONDAY);
System.out.println(monday);

ここでMondayを使用したことに注意してください。これはJoda Timeの週の最初の日であり、常に前の日(または同日)。たとえば、水曜日を選択した場合、月曜日または火曜日から水曜日までadvanceになります。 「次の水曜日」または「前の水曜日」が必要な場合は、いつでも週を追加または削除できます。

編集:reallyJava.util.Date/Calendarを使用する場合、次を使用できます。

Calendar c = Calendar.getInstance();
c.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
System.out.println("Date " + c.getTime());

Calendar.setFirstDayOfWeek 週が月曜日から日曜日か日曜日から土曜日かを示します。 Ibelieve曜日の設定は現在の週内にとどまりますが、テストします。

47
Jon Skeet

tl; dr

_LocalDate previousMonday = 
    LocalDate.now( ZoneId.of( "America/Montreal" ) )
             .with( TemporalAdjusters.previous( DayOfWeek.MONDAY ) );
_

Java.time

Java.util.CalendarクラスとJoda-Timeライブラリの両方が、Java 8以降に組み込まれている Java.time フレームワークに取って代わりました。 Oracle Tutorial を参照してください。 Java.time機能の多くは、 ThreeTen-Backport のJava 6および7にバックポートされ、さらに のAndroidに適応されました。 ThreeTenABP

_Java.time.LocalDate_ クラスは、時刻とタイムゾーンのない日付のみの値を表します。

今日の日付を特定するには、タイムゾーン ZoneId が必要です。

_ZoneId zoneId = ZoneId.of( "America/Montreal" );
LocalDate today = LocalDate.now( zoneId );
_

TemporalAdjuster インターフェイス( Tutorial を参照)は、日時値を操作するための強力でシンプルな方法です。 TemporalAdjusters クラス(複数形に注意)は、いくつかの非常に便利な調整を実装します。ここでは previous( DayOfWeek) を使用します。

便利な DayOfWeek enumを使用すると、曜日を簡単に指定できます。

_LocalDate previousMonday = today.with( TemporalAdjusters.previous( DayOfWeek.MONDAY ) );
_

今日月曜日で、1週間前ではなく今日を使用する場合は、 previousOrSame を呼び出します。


Java.timeについて

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

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

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

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

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

  • Java SE 8Java SE 9 、およびそれ以降
    • ビルトイン。
    • 実装がバンドルされた標準Java AP​​Iの一部。
    • Java 9は、いくつかのマイナーな機能と修正を追加します。
  • Java SE 6 および Java SE 7
    • Java.time機能の多くは、 ThreeTen-Backport のJava 6および7にバックポートされています。
  • Android
    • Androidの後のバージョンは、Java.timeクラスの実装をバンドルします。
    • 以前のAndroid(<26)の場合、 ThreeTenABP プロジェクトはThreeTen-Backport(上記の通り)。 ThreeTenABPの使用方法… を参照してください。

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

18
Basil Bourque

ラッピング月を含む以下が機能します。

Calendar c = Calendar.getInstance();
c.setFirstDayOfWeek(Calendar.MONDAY);
c.setTime(new Date());
int today = c.get(Calendar.DAY_OF_WEEK);
c.add(Calendar.DAY_OF_WEEK, -today+Calendar.MONDAY);
System.out.println("Date "+c.getTime());

ただし、アプリケーションを日曜日(たとえば、2月12日の日曜日)に編集する場合、日付は次の月曜日になります。要件に基づいて(アプリは月曜日から金曜日までしか実行されません)、これは問題になりません。

6
radimpe

Jonが示唆したように、calendar.setメソッドは動作します...同じ月の月曜日の場合と次のスニペットを使用して別の月の両方でテストしました:

Calendar c = Calendar.getInstance();
//ensure the method works within current month
c.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
System.out.println("Date " + c.getTime());
//go to the 1st week of february, in which monday was in january
c.set(Calendar.DAY_OF_MONTH, 1);
System.out.println("Date " + c.getTime());
//test that setting day_of_week to monday gives a date in january
c.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
System.out.println("Date " + c.getTime());
//same for tuesday
c.set(Calendar.DAY_OF_WEEK, Calendar.TUESDAY);
System.out.println("Date " + c.getTime());

結果:

Date Mon Feb 13 10:29:41 CET 2012
Date Wed Feb 01 10:29:41 CET 2012
Date Mon Jan 30 10:29:41 CET 2012
Date Tue Jan 31 10:29:41 CET 2012
2
Simon Baslé

Joda Time library ...の使用についてはどうですか?これをご覧ください answer ...

1
PrimosK

バージョンAndroid 6.0またはgraterの使用:

SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
int day = 1, month = 7, year = 2018;
Calendar c = Calendar.getInstance();
c.setFirstDayOfWeek(Calendar.MONDAY);
c.set(year, month, day);
c.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);  //change de day to monday
String dateMonday= sdf.format(c.getTime());

バージョンAndroid 5.1以下では適切に動作しないため、独自のメソッドを作成しました。

SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
int day = 1, month = 7, year = 2018;
Calendar c = Calendar.getInstance();
c.setFirstDayOfWeek(Calendar.MONDAY);
//set the date with your date or the current date c.set(new Date());
c.set(year, month, day);

int diaSemana = c.get(Calendar.DAY_OF_WEEK);
for (int i = 0; i < 7; i++) {
 if (diaSemana != Calendar.MONDAY) {
     day--;
     c.set(year, month, day);
     diaSemana = c.get(Calendar.DAY_OF_WEEK);
     if (diaSemana == Calendar.MONDAY) break;
  } else {
    break;
 }
}
String dateMonday= sdf.format(c.getTime());
0
Adolfo Rangel

joda Timeを使用したくない場合は、このようにして週を検索できます->(Androidで動作します)

public static ArrayList<String> getWeeks(int month) {

ArrayList<String> arrayListValues = new ArrayList<>();
SimpleDateFormat sdf = new SimpleDateFormat("MMMM d");

Calendar calendar = Calendar.getInstance();

calendar.set(Calendar.MONTH, month);

int day = calendar.get(Calendar.DAY_OF_WEEK);
while (day != 1) {
  calendar.add(Calendar.DATE, 1);
  day = calendar.get(Calendar.DAY_OF_WEEK);
}

calendar.add(Calendar.DATE, -14);
String y1 = sdf.format(calendar.getTime());
calendar.add(Calendar.DATE, 6);
String y2 = sdf.format(calendar.getTime());
calendar.add(Calendar.DATE, 1);
arrayListValues.add(y1 + " - " + y2);

 y1 = sdf.format(calendar.getTime());
calendar.add(Calendar.DATE, 6);
 y2 = sdf.format(calendar.getTime());
calendar.add(Calendar.DATE, 1);
arrayListValues.add(y1 + " - " + y2);



for (int i = 0; i < 10; i++) {

  y1 = sdf.format(calendar.getTime());
  calendar.add(Calendar.DATE, 6);
  y2 = sdf.format(calendar.getTime());
  calendar.add(Calendar.DATE, 1);
  arrayListValues.add(y1 + " - " + y2);
}

return arrayListValues;
}
0
OWADVL