【问题标题】:Get next week dates if today is Sunday如果今天是星期日,则获取下周日期
【发布时间】:2018-05-24 00:36:35
【问题描述】:

如果今天是星期日,如何获取下周日期?我想获取下周周一到周六的日期。

我正在使用以下代码获取日期:

private String[] getDaysOfWeek() {
    String[] days = new String[6];
    SimpleDateFormat format = new SimpleDateFormat("dd");
    Calendar c = GregorianCalendar.getInstance();
    c.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);

    for (int i = 0; i < 6; i++) {
        if (i == 0) {
            days[i] = format.format(c.getTime());
        } else {
            c.add(Calendar.DATE, 1);
            days[i] = format.format(c.getTime());
        }
        System.out.println("DateTest" + days[i]);
    }
    return days;
}

当我设置设备语言英语(美国)时它工作正常,但如果设备设置为语言英语(英国),它会返回前一周日期。

【问题讨论】:

  • 在美国,星期日是一周的第一天。在英国,星期一是。人们可能会怀疑这会以某种方式导致不同的结果。
  • 顺便说一句,将i == 0 的情况保持在循环之外更简单:days[0] = …; 然后for (int i = 1; …),并且您不需要在内部使用if-else 语句循环。
  • 我是否理解正确,无论当前星期几,您都希望星期几的星期一到星期六,将星期日视为一周的第一天?跨度>
  • 一周中不同的第一天是问题所在。对于美国,我们目前已经在第 50 周,因为今天是星期日,这是 Locals.US 的第一周。在英国,我们仍处于“上周”,即第 49 周。如果您明天(周一)开始您的课程,结果将是相同的。那么您对每种情况的预期结果是什么?
  • 仅供参考,您正在使用非常麻烦的旧日期时间类,现在已被现代 java.time 类取代。

标签: java android date weekday java.util.calendar


【解决方案1】:

我建议您使用 java.time,现代 Java 日期和时间 API,也称为 JSR-310,用于像这样的重要日期操作。您可以在非全新的 Android 设备上执行此操作吗?最肯定!获取ThreeTenABP 并开始编码。这是 JSR-310 的 Android Backport。在this question: How to use ThreeTenABP in Android Project中有详尽的解释。

private static String[] getDaysOfWeek() {
    String[] days = new String[6];
    DateTimeFormatter dayOfMonthFormatter = DateTimeFormatter.ofPattern("dd");
    LocalDate today = LocalDate.now(ZoneId.of("America/Montreal"));
    // go back to Sunday, then forward 1 day to get Monday
    LocalDate day = today.with(TemporalAdjusters.previousOrSame(DayOfWeek.SUNDAY))
            .plusDays(1);
    days[0] = day.format(dayOfMonthFormatter);
    for (int i = 1; i < 6; i++) {
        day = day.plusDays(1);
        days[i] = day.format(dayOfMonthFormatter);
    }
    return days;
}

今天(12 月 10 日,星期日,蒙特利尔)调用此方法,我得到下一周的星期几:

[11, 12, 13, 14, 15, 16]

我将 Mac 的区域设置从丹麦(欧洲)更改为美国,结果相同。

由于地球上所有时区的日期都不相同,我建议提供明确的时区来获取今天的日期。请替换我放置美国/蒙特利尔的所需时区。我们不能使用设备的时区设置吗?可能是。您可以使用 JVM 的时区设置(这也是问题中的代码默认执行的操作)。我建议您也通过将ZoneId.systemDefault() 指定为时区,在代码中明确这一点。 JVM 设置可能会被您程序的其他部分或运行在同一 JVM 中的其他程序更改,但是,因此不能保证为您提供设备的首选项设置。

java.time 的一个学习来源是the Oracle tutorial。您的搜索引擎可以将您指向许多其他人。

PS 我原以为WeekFields.SUNDAY_START 可能对这项任务有帮助,但我没有找到一个好的方法来使用它。如果有人能发现我遗漏的东西,我将不胜感激。

【讨论】:

  • 如果我使用 LocalDate.now(ZoneId.systemDefault());
  • @Joe 我仍然不确定你想要得到什么结果。如果今天是星期天,您需要下一个工作日,而这正是您的原始代码提供的。只有那个“下周”可能因地区而异。对于您指定的内容,代码有效,但我猜您希望得到不同的结果?
  • @Joe 或者你必须让用户指定他们想要的时区。对于大多数应用程序,我认为LocalDate.now(ZoneId.systemDefault()) 可以。
  • @Joe 您无法在全球范围内同时获得相同的结果。时区范围超过 26 小时,可能有 27 小时,例如夏令时。对于任何给定的时刻,日期在全球范围内因区域而异。示例:当圣诞节在 12 月 25 日午夜之后在印度开始时,在魁北克,它仍然是“昨天”,即 24 日的平安夜。因此,您必须指定所需/预期的时区以提供日期的上下文,从而提供星期几。
  • @OleV.V.关于WeekFields.SUNDAY_START,该问题似乎是用 ISO 8601 标准(周一至周日,周一是一周的第一天)编写的,其中周一是本周日之后的下一个周。所以WeekFields.ISO 是合适的,而不是WeekFields.SUNDAY_START
【解决方案2】:

Answer by Ole V.V. 是正确且有用的:

  • 您应该使用 java.time 类。永远不要使用Calendar
  • 使用TemporalAdjusters.previousOrSame 获取一周中下一个所需日期的日期。或TemporalAdjusters.nextOrSame,具体取决于您的问题中不清楚的业务逻辑。

来自LocalDate::datesUntil 的流

如果您想变得花哨,可以使用 Java 9 及更高版本中添加的 LocalDate.datesUntil 方法将答案中的 for 循环替换为 Stream。

今天获取,下周一从那里获取。

LocalDate today = LocalDate.now( ZoneId.of( "Pacific/Auckland" ) ) ;
LocalDate nextOrSameMonday = today.with( TemporalAdjusters.nextOrSame( DayOfWeek.MONDAY ) ) ;

制作该周的日期流。

Stream<LocalDate> stream = nextOrSameMonday.datesUntil( nextOrSameMonday.plusWeeks( 1 ) ) ;

将流收集到List

List< LocalDate > dates = stream.collect( Collectors.toList() ) ;

转储到控制台。

System.out.println( dates ) ;

[2019-04-08、2019-04-09、2019-04-10、2019-04-11、2019-04-12、2019-04-13、2019-04-14]

如果你只想要天数:

for ( LocalDate date : dates )
{
    System.out.println( date.getDayOfMonth() );
}

或更改流处理以收集整数列表,即月份数字。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多