次のような週間カレンダーを作成しようとしています: http://dhtmlx.com/docs/products/dhtmlxScheduler/sample_basic.html
毎週の日付をどのように計算できますか?たとえば、今週は次のとおりです。
月曜日日曜日
6月7日、6月8日、6月9日、6月10日、6月11日、6月12日、6月13日
これはあなたが望むことをすると思います:
// Get calendar set to current date and time
Calendar c = Calendar.getInstance();
// Set the calendar to monday of the current week
c.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
// Print dates of the current week starting on Monday
DateFormat df = new SimpleDateFormat("EEE dd/MM/yyyy");
for (int i = 0; i < 7; i++) {
System.out.println(df.format(c.getTime()));
c.add(Calendar.DATE, 1);
}
Java 8の新しい日時APIを使用すると、次のようになります。
LocalDate now = LocalDate.now();
// determine country (Locale) specific first day of current week
DayOfWeek firstDayOfWeek = WeekFields.of(Locale.getDefault()).getFirstDayOfWeek();
LocalDate startOfCurrentWeek = now.with(TemporalAdjusters.previousOrSame(firstDayOfWeek));
// determine last day of current week
DayOfWeek lastDayOfWeek = firstDayOfWeek.plus(6); // or minus(1)
LocalDate endOfWeek = now.with(TemporalAdjusters.nextOrSame(lastDayOfWeek));
// Print the dates of the current week
LocalDate printDate = startOfCurrentWeek;
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("EEE dd/MM/yyyy");
for (int i=0; i < 7; i++) {
System.out.println(printDate.format(formatter));
printDate = printDate.plusDays(1);
}
今週の最初の日。
Calendar c = Calendar.getInstance();
while (c.get(Calendar.DAY_OF_WEEK) != Calendar.MONDAY) {
c.add(Calendar.DATE, -1);
}
単に曜日を設定するだけでは信頼性が低いようです。次の単純なコードを考えてみます。
Calendar calendar = Calendar.getInstance(Locale.GERMANY);
calendar.set(2011, Calendar.SEPTEMBER, 18);
System.out.printf("Starting day: %tF%n", calendar);
calendar.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
System.out.printf("Last monday: %tF%n", calendar);
System.out.printf("First day of week: %d%n", calendar.getFirstDayOfWeek());
このプログラムを実行した結果は次のとおりです。
Starting day: 2011-09-18
Last monday: 2011-09-19
First day of week: 2
言い換えれば、それは時間的に前進した。ドイツ語ロケールの場合、これは実際には予期された答えではありません。カレンダーは月曜日を週の最初の日として正しく使用していることに注意してください(おそらくその年の週を計算するためだけに)。
Java 8に組み込まれている_Java.time
_ライブラリの使用:8:
_import Java.time.DayOfWeek;
import Java.time.LocalDate;
import static Java.time.temporal.TemporalAdjusters.previousOrSame;
import static Java.time.temporal.TemporalAdjusters.nextOrSame;
LocalDate now = LocalDate.now(); # 2015-11-23
LocalDate first = now.with(previousOrSame(DayOfWeek.MONDAY)); # 2015-11-23
LocalDate last = now.with(nextOrSame(DayOfWeek.SUNDAY)); # 2015-11-29
_
DayOfWeek.values()
を反復処理して、現在のすべての曜日を取得できます
_DayOfWeek.values(); # Array(MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY)
for (DayOfWeek day: DayOfWeek.values()) {
System.out.print(first.with(nextOrSame(day)));
} # 2015-11-23, 2015-11-24, 2015-11-25, 2015-11-26, 2015-11-27, 2015-11-28, 2015-11-29
_
次のコードは、今から15週間の各週の最初と最後の日付を出力します。
Calendar c = Calendar.getInstance();
c.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
for(int i=0; i<15; i++)
{
System.out.print("Start Date : " + c.getTime() + ", ");
c.add(Calendar.DAY_OF_WEEK, 6);
System.out.println("End Date : " + c.getTime());
c.add(Calendar.DAY_OF_WEEK, 1);
}
Calendar startCal = Calendar.getInstance();
startCal.setTimeInMillis(startDate);
Calendar endCal = Calendar.getInstance();
endCal.setTimeInMillis(endDate);
SimpleDateFormat sdf = new SimpleDateFormat("dd-MMMM-yyyy");
while (startCal.before(endCal)) {
int weekNumber = startCal.get(Calendar.WEEK_OF_YEAR);
Calendar cal = Calendar.getInstance();
cal.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY);
cal.set(Calendar.WEEK_OF_YEAR, weekNumber);
Date sunday = cal.getTime();
Log.d("sunday", "" + sdf.format(sunday));
cal.set(Calendar.DAY_OF_WEEK, Calendar.SATURDAY);
cal.set(Calendar.WEEK_OF_YEAR, weekNumber);
Date saturday = cal.getTime();
Log.d("saturday", "" + sdf.format(saturday));
weekNumber = weekNumber + 1;
startCal.set(Calendar.WEEK_OF_YEAR, weekNumber);
}
現在の日付(金曜日)と現在の日付(6月11日)がわかっている場合は、今週の他の曜日を計算できます。
Joda タイムライブラリを使用することをお勧めします。 Gregorian Calendarクラスには、weekOfWeekyearメソッドとdayOfWeekメソッドがあります。
探しているアルゴリズム(任意の日付の曜日を計算)は、「ツェラーの合同」です。ここにJava実装があります:
http://technojeeves.com/joomla/index.php/free/57-zellers-congruence
はい。 Joda Timeを使用する