乔达时间:每周的第一天?

如果使用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();