0

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

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

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;
}

当我设置设备Language english(US)时它工作正常,但如果设备设置为Language english(UK)它会返回前一周的日期。

4

2 回答 2

3

我建议您使用java.time现代 Java 日期和时间 API,也称为 JSR-310,用于像这样的非平凡日期操作。您可以在非全新的 Android 设备上执行此操作吗?最肯定!获取ThreeTenABP并开始编码。这是 JSR-310 的 Android Backport。这个问题有一个详尽的解释: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.timeOracle 教程。您的搜索引擎可以将您指向许多其他人。

PS 我曾预计这WeekFields.SUNDAY_START可能对这项任务有所帮助,但我没有找到一种很好的方法来使用它。如果有人能发现我错过的东西,我将不胜感激。

于 2017-12-10T10:24:30.833 回答
0

Ole VV的答案是正确且有用的:

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

流自LocalDate::datesUntil

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

今天得到,下周一从那里得到。

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() );
}

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

于 2019-04-02T03:11:59.997 回答