如果使用 Joda-Time 的区域设置?

要点:大多数国家/地区星期一使用国际标准作为一周的第一天(!)。其他一些人使用星期天(特别是美国)。其他人显然是星期六。有些人显然是星期三?!

维基百科“七天工作周”#Week_number

有帮助吗?

解决方案

Joda-Time在周一至周日使用ISO标准。

它无法获得一周的第一天,也无法根据标准星期一以外的任何一天返回星期几索引。最后,总是按照ISO规则计算周数。

其他提示

没有理由你至少不能使用JDK来找到“习惯性的一周开始”。对于给定的区域设置。唯一棘手的部分是翻译工作日的常量,其中两者都是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的结果。

以下是乔达有时可以解决美国本周第一天的问题:

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)
}

好像你运气不好,看起来所有提供的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)。

所以你的问题是,如何从Joda DateTime对象获取DayOfWeek?那怎么样:

DateTime dt = new DateTime().withYear(2009).plusDays(111);
dt.toGregorianCalendar().getFirstDayOfWeek();

我在 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)只是为了使周从周日到周六(而不是默认的星期一到星期天知道 Joda )。对于美国(和其他类似的)语言环境,您可以忽略此部分

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top