首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >日历在一些Android设备上返回糟糕的一周开始。

问日历在一些Android设备上返回糟糕的一周开始。
EN

Stack Overflow用户
提问于 2018-05-28 18:29:48
回答 2查看 1.1K关注 0票数 0

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

代码语言:javascript
复制
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。这些设备具有相同的地区和相同的时区。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-05-29 12:08:40

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

代码语言:javascript
复制
    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。今日(五月二十九日星期二)刊载

2018-05-27

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

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

代码语言:javascript
复制
    LocalDate firstDayOfThisWeek = today
            .with(TemporalAdjusters.previousOrSame(DayOfWeek.SUNDAY));

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

你的代码出了什么问题?

正如我所理解的文档,您的代码应该给出本星期的星期日。Calendar周日使用1。您可能已经使用calendar.set(DAY_OF_WEEK, SUNDAY)来获得完全相同的信息。当我今天运行它,我得到5月27日当使用星期日作为一周的第一天和6月3日当使用星期一作为第一天(这意味着星期日是一周的最后一天)。不过,文档并不十分清楚,Calendar类可能会让人感到困惑。在任何情况下,这可能也是在不同设备上尝试时发生的情况:它们对周有不同的定义。如果您可以单独配置周定义,即使它们具有相同的区域设置,也可能出现这种情况。

问:我可以在安卓系统上使用java.time吗?

是的,java.time在较旧的和更新的安卓设备上运行得很好。它只需要至少需要Java 6。

  • 在Java 8和更高版本以及更新的Android设备上(据我所知,API级别为26 ),现代API是内置的。
  • 在Java6和7中,获取ThreeTen Backport,这是新类的后端(ThreeTen用于JSR 310;参见底部的链接)。
  • 在(旧版) Android上,使用安卓版本的ThreeTen Backport。它叫ThreeTenABP。并确保使用子包从org.threeten.bp导入日期和时间类。

链接

票数 2
EN

Stack Overflow用户

发布于 2018-05-29 05:35:13

每周的第一天对于不同的国家是不同的。如果希望对所有用户都是相同的,可以将一个Locale传递给Calendar。

代码语言:javascript
复制
Calendar currentCalendar = Calendar.getInstance(new Locale("en","UK"));

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

您可以实现如下内容:

代码语言:javascript
复制
Calendar cal = Calendar.getInstance();
cal.setFirstDayOfWeek(Calendar.MONDAY);
int rec = cal.get(Calendar.WEEK_OF_MONTH);
System.out.println(rec);

阅读有关API 这里的更多信息。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50571850

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档