58

您如何使用Joda-Time根据给定的语言环境确定一周中的哪一天被视为“开始” ?

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

维基百科“七日周”#Week_number

4

8 回答 8

47

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

它没有能力获取星期的第一天,也没有能力返回基于标准星期一以外的任何一天的星期索引。最后,周数总是根据 ISO 规则计算的。

于 2009-11-27T11:38:29.667 回答
16

没有理由至少不能使用 JDK 来为给定的语言环境找到“一周的习惯开始”。唯一棘手的部分是转换工作日的常量,两者都是 1 到 7,但 java.util.Calendar 移动了 1,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 而非默认值的结果。

于 2012-11-02T19:36:09.130 回答
7

以下是人们如何利用 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)
}
于 2014-10-23T16:45:08.880 回答
2

好像你不走运,看起来所有提供的 Chronologies 都继承了 baseChronology 的实现,它只支持 ISO 定义,即 Monday=1 ... Sunday=7。

您必须定义自己的 LocaleChronology,可能以 StrictChronology 或 LenientChronology 为模型,添加工厂方法:

public static LocaleChronology getInstance(Chronology base, Locale locale)

并覆盖

public final DateTimeField dayOfWeek()

重新实现依赖于 sun.util.resources.LocaleData..getCalendarData(desiredLocale) 的 java.util.Calendar.setWeekCountData(Locale desiredLocale)。

于 2009-11-26T14:38:19.177 回答
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);
}
于 2019-12-27T00:32:23.287 回答
0

这是动态获取一周中开始和结束日期的 Scala 代码。

注意:- 确保开始和结束是有序的,例如当开始日是Sunday一周Monday的结束日

def shiftWeeksBy(startDayOfWeek: Int, currentWeekDay: Int) : Int = (startDayOfWeek, currentWeekDay) match {
  case (s, c) if s <= c  | s == 1 => 0 //start day of week is Monday -OR- start day of week <= current week day
  case _ => 1
}

def getStartAndEndDays(initialTime: DateTime, startDayOfWeek: Int, endDayOfWeek: Int): (Option[DateTime], Option[DateTime]) = {
   val currentDateWeekDay = initialTime.dayOfWeek.get
   (Some(initialTime.minusWeeks(shiftWeeksBy(startDayOfWeek, currentDateWeekDay)).withDayOfWeek(startDayOfWeek).withTimeAtStartOfDay()),
       Some(initialTime.plusWeeks(shiftWeeksBy(currentDateWeekDay, endDayOfWeek)).withDayOfWeek(endDayOfWeek)))
}

输出:-对于5th Jan 2021一周的开始日期Thursday和结束日期是Wednesday一周的开始2020-12-31和结束2021-01-06

scala> getStartAndEndDays(new DateTime("2021-01-05T00:00:00.000"), 4, 3)
res5: (Option[org.joda.time.DateTime], Option[org.joda.time.DateTime]) = (Some(2020-12-31T00:00:00.000+05:30),Some(2021-01-06T00:00:00.000+05:30))
于 2021-11-23T06:24:45.920 回答
-1

所以你的问题是,如何从 Joda DateTime 对象中获取 DayOfWeek ?那这个呢:

DateTime dt = new DateTime().withYear(2009).plusDays(111);
dt.toGregorianCalendar().getFirstDayOfWeek();
于 2009-11-26T09:58:09.860 回答
-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)只是为了使星期跨度从星期日到星期六(而不是已知的默认星期一到星期日Joda)。对于美国(和其他类似)语言环境,您可以忽略这部分

于 2017-12-15T09:21:26.340 回答