30

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

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

9 に答える 9

53

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

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

ここでは、Joda Timeの週の最初の日である月曜日を使用しているため、これは常に前日(または同じ日)に戻ることに注意してください。たとえば、水曜日を選択した場合は、月曜日または火曜日から水曜日に進みます。「次の水曜日」または「前の水曜日」が必要な場合は、いつでも1週間を加算または減算できます。

編集:本当にjava.util.Date/Calendarを使用したい場合は、以下を使用できます。

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

Calendar.setFirstDayOfWeek週が月曜日から日曜日か日曜日から土曜日かを示すために使用できます。曜日の設定は現在の週の範囲内にとどまると思いますが、テストしてください。

于 2012-02-16T08:40:18.063 に答える
27
于 2016-07-06T19:27:28.210 に答える
6

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

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日日曜日など)にアプリケーションを編集する場合、日付は次の月曜日になります。要件に基づいて(アプリは月曜日から金曜日までのみ実行されます)、これで問題が発生することはありません。

于 2012-02-16T09:20:38.737 に答える
2

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
于 2012-02-16T09:34:40.773 に答える
1

JodaTimeライブラリを使用するのはどうですか...この回答を見てください...

于 2012-02-16T08:39:17.767 に答える
0

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;
}
于 2016-07-06T12:38:15.453 に答える
0

バージョンAndroid6.0以降の場合:

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());
于 2019-02-08T18:39:52.433 に答える
0

Kotlinコード。古いAndroidバージョンで動作します

    val c = Calendar.getInstance()
    c.time = Date()
    
    while (c.get(Calendar.DAY_OF_WEEK) != Calendar.MONDAY) {
        c.add(Calendar.DAY_OF_WEEK, -1)
    }
于 2021-02-21T16:17:57.483 に答える
-2

現在の週の月曜日が前月である場合は機能しません...たとえば、今日が6月1日金曜日の場合...おそらくロール方式を使用する必要があります...

于 2012-02-16T08:54:12.613 に答える