Joda-Time を使用して Locale を指定すると、週の最初の日をどのように取得しますか?
ポイント:ほとんどの国では、月曜日(!)として月曜日に国際標準を使用しています。他の人は日曜日を使用します(特に米国)。他の人は明らかに土曜日。どうやら水曜日?
Joda-Timeは月曜日から日曜日の週にISO標準を使用します。
週の最初の曜日を取得することも、標準の月曜日以外の日に基づいて曜日のインデックスを返すこともできません。最後に、週は常にISOルールによって計算されます。
少なくとも特定のロケールの「慣習的な週の始まり」を見つけるためにJDKを使用できない理由はありません。唯一のトリッキーな部分は、平日の定数の変換です。両方とも1〜7ですが、Java.util.CalendarはCalendar.MONDAY = 2とDateTimeConstants.MONDAY = 1で1ずつシフトされます。
とにかく、この関数を使用します:
/**
* Gets the first day of the week, in the default locale.
*
* @return a value in the range of {@link DateTimeConstants#MONDAY} to
* {@link DateTimeConstants#SUNDAY}.
*/
private static final int getFirstDayOfWeek() {
return ((Calendar.getInstance().getFirstDayOfWeek() + 5) % 7) + 1;
}
LocaleをCalendar.getInstance()に追加して、デフォルト以外のLocaleの結果を取得します。
ジョーダの時間を回避して、米国の週の最初の曜日を取得する方法を次に示します。
DateTime getFirstDayOfWeek(DateTime other) {
if(other.dayOfWeek.get == 7)
return other;
else
return other.minusWeeks(1).withDayOfWeek(7);
}
またはScalaで
def getFirstDayOfWeek(other: DateTime) = other.dayOfWeek.get match {
case 7 => other
case _ => other.minusWeeks(1).withDayOfWeek(7)
}
運が悪いようです、提供されたすべての年表はbaseChronologyから実装を継承しているようです。baseChronologyはISO定義のみをサポートしています。
StrictChronologyまたはLenientChronologyをモデルにした独自のLocaleChronologyを定義し、ファクトリメソッドを追加する必要があります。
public static LocaleChronology getInstance(Chronology base, Locale locale)
の実装をオーバーライドします
public final DateTimeField dayOfWeek()
sun.util.resources.LocaleData..getCalendarData(desiredLocale)に依存するJava.util.Calendar.setWeekCountData(Locale desiredLocale)を再実装します。