首页 > 解决方案 > 使用 ThreeTen 在 Android 中显示日期时发生冲突

问题描述

我在 android 中使用 ThreeTen 来显示从当前日期开始的 1 周日期。但是,问题是日期没有以正确的顺序显示。

这是我从当前日期开始的第 1 周日期的代码:

public List<LocalDate> getWeekDays() {

    ZoneId z = ZoneId.of("Pacific/Auckland");  // Or ZoneId.of( "Africa/Tunis" )
    LocalDate today = LocalDate.now( z ) ;

   LocalDate localDate = today.with( org.threeten.bp.temporal.TemporalAdjusters.previousOrSame( DayOfWeek.SUNDAY ) ) ;     
    List< LocalDate > dates = new ArrayList<>( 7 ) ;
    for( int i = 0 ; i < 7 ; i ++ ) {
        localDate = localDate.plusDays( i ) ;
        dates.add( localDate ) ;
    }
        return dates;

}

这是显示日期的图片,请检查:

在此处输入图像描述

标签: javaandroiddatelocaldatethreetenbp

解决方案


for循环中的逻辑缺陷

您将天数添加到前一个日期,而不是您的开始日期

在您的循环i中运行值 0 到 6。您从 10 月 21 日星期日开始。第一次通过您的循环添加 0 天,所以仍然有 10 月 21 日(正确)。下次添加 1 天时,得到 10 月 22 日,星期一也正确。下次您添加 2 天并获得 10 月 24 日。然后您添加 3 天、4 天等。这解释了您的结果。

两个可能的修复。改变这个:

    localDate = localDate.plusDays( i ) ;
    dates.add( localDate ) ;

……对于这个:

    LocalDate ld = localDate.plusDays( i ) ;  // Add `i` number of days to the *start* date, not the incrementing date. 
    dates.add( ld ) ;

…<em>或者这个:

    dates.add( localDate ) ;
    localDate = localDate.plusDays( 1 ) ; // only add 1 day to previous date

在第一种情况下,为清楚起见,最好将localDate变量名称更改startDate为 。


推荐阅读