在某些Android设备上,日历会返回糟糕的周开始

时间:2018-05-28 18:29:49

标签: android date kotlin dayofweek java.util.calendar

我想知道本周第一天的日期。所以我用这种方式实现了它:

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。设备具有相同的区域设置和相同的时区。

2 个答案:

答案 0 :(得分:2)

如果我理解正确,你想把星期日视为一周的第一天(如在美国)。

    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年5月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)获得完全相同的内容。当我今天运行它时,我将使用星期日作为星期一和6月3日使用星期一作为第一天(这意味着星期日是一周的最后一天)。但是,文档不是很清楚,Calendar类可能会令人困惑。在任何情况下,可能这也是你在不同设备上尝试时发生的事情:它们有不同的周定义。如果您可以单独配置周定义,即使它们具有相同的区域设置,也可以这样做。

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

是的,java.time适用于较旧和较新的Android设备。它只需要至少Java 6

  • 在Java 8及更高版本和更新的Android设备上(来自API级别26,我被告知)现代API内置。
  • 在Java 6和7中获取ThreeTen Backport,新类的后端端口(适用于JSR 310的ThreeTen;请参阅底部的链接)。
  • On(较旧)Android使用Android版的ThreeTen Backport。它被称为ThreeTenABP。并确保使用子包从org.threeten.bp导入日期和时间类。

链接

答案 1 :(得分:1)

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

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

也来自this回答,您可以使用方法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 HERE