代码之家  ›  专栏  ›  技术社区  ›  Nominalista

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

  •  0
  • Nominalista  · 技术社区  · 6 年前

    我想知道本周第一天的日期。所以我是这样实现的:

    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.*

    编辑: 今天(2018年5月28日)只需记录此函数的结果,您将看到2018年5月27日或2018年6月3日。这些设备具有相同的区域设置和相同的时区。

    2 回复  |  直到 6 年前
        1
  •  2
  •   Anonymous    6 年前

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

        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

    你的代码出了什么问题?

    据我所知,您的代码应该给出本周的星期日。 日历 星期日使用1。你可能用过 calendar.set(DAY_OF_WEEK, SUNDAY) 获得完全相同的结果。当我今天运行它时,如果将星期日作为一周的第一天,我将得到5月27日;如果将星期一作为第一天,我将得到6月3日(这意味着星期日是一周的最后一天)。但是,文档不太清楚,而且 日历 类可能会令人困惑。在任何情况下,当你尝试不同的设备时,可能也会发生这种情况:它们对周有不同的定义。如果可以单独配置周定义,即使它们具有相同的区域设置,也可以这样做。

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

    对, java.time时间 在较旧和较新的Android设备上运行良好。它至少需要Java .

    • 在Java 8和之后以及新的Android设备(从API级别26,Im告诉)现代API是内置的。
    • 在Java 6和7中获得三重后端,即新类的后端(JSR 310的三层,参见底部的链接)。
    • 在(旧版)Android上,使用Android版的threeten backport。它叫三合一。并确保从导入日期和时间类 org.threeten.bp 带有子包。

    链接

        2
  •  1
  •   Adib Faramarzi    6 年前

    一周的第一天对于不同的国家是不同的。如果您希望对所有用户都相同,可以通过 Locale Calendar

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

    也来自 this 答:您可以使用setFirstDayOfWeek()方法设置一周的第一天。该方法只能影响“月”的“周”或“年”的“周”的返回值。一周中的第天,它什么都不做。

    您可以实现如下功能:

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

    了解更多关于API的信息 HERE