乔达时间:每周的第一天?
如果使用Joda-Time的语言环境 ,您如何获得每周的第一天?
要点:大多数国家星期一使用国际标准作为星期几(!)的第一天。 其他一些人使用星期天(特别是美国)。 其他人显然是星期六。 有些显然是星期三?
维基百科“七天一周”#Week_number
Joda-Time使用星期一到星期天的ISO标准。
它不具有获取一周的第一天的能力,也不能够基于标准星期一以外的任何一天返回星期几指数。 最后,周总是按照ISO规则计算。
没有理由不能使用JDK至less为给定的语言环境find“惯常开始的一周”。 唯一棘手的部分是平移常量,其中都是1到7,但java.util.Calendar移动一,Calendar.MONDAY = 2与DateTimeConstants.MONDAY = 1。
无论如何,使用这个function:
/** * 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()添加一个语言环境,以获取除默认值之外的某些语言环境的结果。
下面是如何绕过乔达时间来获得美国的第一天的一周:
DateTime getFirstDayOfWeek(DateTime other) { if(other.dayOfWeek.get == 7) return other; else return other.minusWeeks(1).withDayOfWeek(7); }
或者在斯卡拉
def getFirstDayOfWeek(other: DateTime) = other.dayOfWeek.get match { case 7 => other case _ => other.minusWeeks(1).withDayOfWeek(7) }
看起来好像你运气不好,它看起来像所有提供的ChronologiesinheritancebaseChronology的实施,它只支持ISO定义,即星期一= 1 …星期日= 7。
你将不得不定义自己的LocaleChronology,可能在StrictChronology或LenientChronology上build模,添加一个工厂方法:
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();