如果今天是星期天,下周的日期

时间:2017-12-10 07:34:56

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

如果今天周日,如何获得下周的日期?我希望下周的日期为周一至周六

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

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

设置设备语言英语(美国)时效果正常,但如果设备设置为语言英语(英国),则会返回上一周的日期。

2 个答案:

答案 0 :(得分:3)

我建议您使用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可能对此任务有帮助,但我没有找到一个好的方法来使用它。如果有人能发现我错过的东西,我会感激你的暗示。

答案 1 :(得分:0)

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

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

来自LocalDate::datesUntil

的流

如果想花哨的话,可以使用Java 9和更高版本中添加的for方法用Stream替换该Answer中的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() );
}

或更改流处理以收集整数列表(月日数字)。