在某些 Android 设备上,日历会返回错误的一周开始



我想得到本周第一天的日期。所以我以这种方式实现它:

fun getFirstDayInCurrentWeek(): Date {
val calendar = Calendar.getInstance()
calendar.clear(MILLISECOND)
calendar.clear(SECOND)
calendar.clear(MINUTE)
calendar.set(HOUR_OF_DAY, 0)
calendar.set(DAY_OF_WEEK, 1)
return calendar.time
}

它适用于大多数设备,但有时它会返回下周第一天的日期。我想不通为什么。

这些课程来自java.util.*.

编辑:只需记录今天(28.05.2018(此功能的结果,您将看到27.05.2018或03.06.2018。设备具有相同的区域设置和时区。

如果我理解正确,您要将星期日视为一周的第一天(如在美国(。

WeekFields wf = WeekFields.SUNDAY_START;
LocalDate today = LocalDate.now(ZoneId.of("Europe/Warsaw"));
LocalDate firstDayOfThisWeek = today.with(wf.dayOfWeek(), 1);
System.out.println(firstDayOfThisWeek);

我正在编写 Java 代码,并相信您会转换为 Kotlin。今天(5月29日星期二(运行,这张印刷品

2018年05月27

如果您希望星期一作为一周的第一天(如波兰和国际标准所说(,只需使用WeekFields.ISO而不是WeekFields.SUNDAY_START.如果您希望它依赖于区域设置,请使用例如WeekFields.of(Locale.forLanguageTag("pl-PL"))

另一个可能更明确的选择是:

LocalDate firstDayOfThisWeek = today
.with(TemporalAdjusters.previousOrSame(DayOfWeek.SUNDAY));

在这两种情况下,我都使用java.time,现代Java日期和时间API。我认为这是一个很好的例子,说明它提供了更清晰的代码,与旧的日期和时间类(如Calendar(相比,情况通常如此。

您的代码中出了什么问题?

据我了解文档,您的代码应该给出本周的星期日。Calendar使用 1 表示星期日。您可能已经使用calendar.set(DAY_OF_WEEK, SUNDAY)来获得完全相同的结果。当我今天运行它时,当使用星期日作为一周的第一天时,我会得到 5 月 27 日,当使用星期一作为第一天时,我会得到 6 月 3 日(这意味着星期日是一周的最后一天(。但是,文档不是很清楚,并且Calendar类可能会令人困惑。无论如何,当您尝试使用不同的设备时,可能这也是发生的事情:它们对周的定义不同。如果可以单独配置周定义,即使它们具有相同的区域设置,也可能发生这种情况。

问:我可以在 Android 上使用 java.time 吗?

是的,java.time在较旧和较新的Android设备上运行良好。它只需要至少Java6

  • 在Java 8及更高版本以及较新的Android设备上(我被告知从API级别26开始(,现代API是内置的。
  • 在Java 6和7中获取ThreeTen Backport,新类的反向移植(JSR 310的ThreeTen;请参阅底部的链接(。
  • 在(较旧的(Android上使用Android版本的ThreeTen Backport。它被称为ThreeTenABP。并确保从带有子包的org.threeten.bp导入日期和时间类。

链接

  • Oracle 教程:解释如何使用java.time的日期时间。
  • Java 规范请求 (JSR( 310,其中首次描述了java.time
  • ThreeTen Backport 项目,将java.time向 Java 6 和 7 的反向移植(JSR-310 为 ThreeTen(。
  • ThreeTenABP,ThreeTen Backport 的安卓版
  • 问:如何在Android项目中使用ThreeTenABP,并进行了非常详尽的解释。

不同国家/地区每周的第一天是不同的。如果您希望所有用户都相同,则可以将Locale传递给Calendar

Calendar currentCalendar = Calendar.getInstance(new Locale("en","UK"));

同样从这个答案中,您可以使用方法setFirstDayOfWeek((来设置一周的第一天。该方法只能影响 WEEK_OF_MONTH 或 WEEK_OF_YEAR 的返回值。对于DAY_OF_WEEK来说,它什么也没做。

您可以实现如下内容:

Calendar cal = Calendar.getInstance();
cal.setFirstDayOfWeek(Calendar.MONDAY);
int rec = cal.get(Calendar.WEEK_OF_MONTH);
System.out.println(rec);

在此处阅读有关 API 的更多信息

最新更新