如果Locale使用Joda-Time,您如何获得一周的第一天?
要点:大多数国家/地区星期一使用国际标准作为一周的第一天(!)。其他一些人使用星期天(特别是美国)。其他人显然是星期六。有些人显然是星期三?!
答案 0 :(得分:44)
Joda-Time在周一至周日使用ISO标准。
它无法获得一周的第一天,也无法根据标准星期一以外的任何一天返回星期几索引。最后,总是按照ISO规则计算周数。
答案 1 :(得分:14)
至少没有理由不能使用JDK来查找给定Locale的“本周的习惯性开始”。唯一棘手的部分是翻译工作日的常量,其中两者都是1到7,但是java.util.Calendar被移一,Calendar.MONDAY = 2而DateTimeConstants.MONDAY = 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的结果。
答案 2 :(得分:5)
以下是乔达有时可以解决美国本周第一天的问题:
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)
}
答案 3 :(得分:2)
好像你运气不好,看起来所有提供的Chronologies都继承了baseChronology的实现,它只支持ISO定义, 即星期一= 1 ...星期日= 7。
您必须定义自己的LocaleChronology,可能是在StrictChronology或LenientChronology上建模,添加工厂方法:
public static LocaleChronology getInstance(Chronology base, Locale locale)
并覆盖
的实现public final DateTimeField dayOfWeek()
重新实现java.util.Calendar.setWeekCountData(Locale desiredLocale),它依赖于sun.util.resources.LocaleData..getCalendarData(desiredLocale)。
答案 4 :(得分:0)
这是我想出的。 startOfWeek
将始终是星期日的开始,而endOfweek
将始终是星期六的结束(星期一的开始)。
DateTime startOfWeek;
DateTime endOfWeek;
// make sure Sunday is the first day of the week, not Monday
if (dateTime.getDayOfWeek() == 7) {
startOfWeek = dateTime.plusDays(1).weekOfWeekyear().roundFloorCopy().minusDays(1);
endOfWeek = dateTime.plusDays(1).weekOfWeekyear().roundCeilingCopy().minusDays(1);
} else {
startOfWeek = dateTime.weekOfWeekyear().roundFloorCopy().minusDays(1);
endOfWeek = dateTime.weekOfWeekyear().roundCeilingCopy().minusDays(1);
}
答案 5 :(得分:-1)
所以你的问题是,如何从Joda DateTime对象获取DayOfWeek?那怎么样:
DateTime dt = new DateTime().withYear(2009).plusDays(111);
dt.toGregorianCalendar().getFirstDayOfWeek();
答案 6 :(得分:-1)
我在Scala
中使用了以下存根来获取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)
仅用于将周日至周六的周跨度(而不是{{1}的默认周一至周日}})。对于美国(和其他类似的)语言环境,您可以忽略此部分