Joda-Timeを使用して、特定のLocaleに従ってどの曜日が「開始」と見なされるかをどのように判断しますか?
ポイント: ほとんどの国では、国際標準の月曜日を週の最初の曜日 (!) として使用しています。他の多くの人が日曜日を使用しています (特に米国)。他はどうやら土曜日。どうやら水曜日?
Joda-Timeは、月曜日から日曜日の週にISO標準を使用します。
曜日を取得したり、標準の月曜日以外の曜日に基づいて曜日インデックスを返したりすることはできません。最後に、週は常にISOルールで計算されます。
少なくとも特定の Locale の「通常の週の始まり」を見つけるために 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 の結果を取得します。
米国の週の最初の曜日を取得するために Joda 時間を回避する方法は次のとおりです。
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)
}
運が悪かったようです。提供されている Chronology はすべて、ISO 定義のみをサポートする baseChronology から実装を継承しているようです。つまり、Monday=1 ... Sunday=7 です。
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) の再実装による。
だからあなたの質問は、JodaDateTimeオブジェクトからDayOfWeekを取得する方法ですか?これはどうですか:
DateTime dt = new DateTime().withYear(2009).plusDays(111);
dt.toGregorianCalendar().getFirstDayOfWeek();