ジョーダ時間:週の最初の日?
質問
ポイント:ほとんどの国では月曜日を国際標準の月曜日(!)として使用しています。他の人は日曜日を使用します(特に米国)。他の人は明らかに土曜日。どうやら水曜日ですか?!
解決
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;
}
ロケールをCalendar.getInstance()に追加して、デフォルト以外のロケールの結果を取得します。
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)
}
運が悪いようです。提供されているすべての年表は、ISO定義のみをサポートするbaseChronologyから実装を継承しているようです。 すなわち、月曜日= 1 ...日曜日= 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)を再実装したもの。
質問は、Joda DateTimeオブジェクトからDayOfWeekを取得する方法ですか?これはどうですか:
DateTime dt = new DateTime().withYear(2009).plusDays(111);
dt.toGregorianCalendar().getFirstDayOfWeek();
Scala
で次の stub を使用して、 Joda
DateTime
から週の最初と最後の曜日を取得しました
val today: DateTime = new DateTime()
val dayOfWeek: DateTime.Property = today.dayOfWeek()
val firstDayOfWeek: DateTime = dayOfWeek.withMinimumValue().minusDays(1)
val lastDayOfWeek: DateTime = dayOfWeek.withMaximumValue().minusDays(1)
注: minusDays(1)
は、週曜日を日曜日から土曜日までにすることを目的としています(デフォルトの月曜日から Joda
が知っている日曜日)。米国(および他の同様の)ロケールの場合、この部分を無視できます