将日期设置为选项卡

时间:2016-04-30 07:30:43

标签: java android date tabs

我正在尝试将当前日期显示在我的标签上,但左边的日期并没有减少一个。我究竟做错了什么?任何帮助将不胜感激,谢谢。

private void setupViewPager(ViewPager viewPager) {
    ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());
    Calendar cal = Calendar.getInstance();
    DateFormat dateFormat1 = new SimpleDateFormat("EEEE, MMM dd, yyyy", Locale.getDefault());


    for (int j = 0; j < 2; j++){
        cal.add(Calendar.DATE, -1);
        String yest = dateFormat1.format(cal.getTime());
        adapter.addFragment(new ThreeFragment(), yest);
    }

    String todate = dateFormat1.format(cal.getTime());
    adapter.addFragment(new OneFragment(), todate);

    for(int i = 0; i < 2; i++) {
        cal.add(Calendar.DATE, 1);
        String tomo = dateFormat1.format(cal.getTime());
        adapter.addFragment(new TwoFragment(), tomo);

    }

    viewPager.setAdapter(adapter);
}

enter image description here

1 个答案:

答案 0 :(得分:1)

逻辑错误

您的代码背后的逻辑是错误的。例如,今天是30日。在您的代码到达“今天”时,您已经删除了两天。因此,您的代码使其看起来像“今天”是第28个。

此外,在您生成todate的两个循环之间,您不会使用add调用-1,因此日期与上一次循环的时间保持一致。< / p>

我复制了您的代码,将ViewPageAdapter替换为System.out.println调用。

Calendar cal = Calendar.getInstance ();
DateFormat dateFormat1 = new SimpleDateFormat ( "EEEE, MMM dd, yyyy" , Locale.getDefault () );
System.out.println ( "cal: " + dateFormat1.format ( cal.getTime () ) );

for ( int j = 0 ; j < 2 ; j ++ ) {
    cal.add ( Calendar.DAY_OF_MONTH , -1 );
    String yest = dateFormat1.format ( cal.getTime () );
    System.out.println ( "yest: " + yest );
}

String todate = dateFormat1.format ( cal.getTime () );
System.out.println ( "todate: " + todate );

for ( int i = 0 ; i < 2 ; i ++ ) {
    cal.add ( Calendar.DATE , 1 );
    String tomo = dateFormat1.format ( cal.getTime () );
    System.out.println ( "tomo: " + tomo );
}

运行时。

cal: Saturday, Apr 30, 2016
yest: Friday, Apr 29, 2016
yest: Thursday, Apr 28, 2016
todate: Thursday, Apr 28, 2016
tomo: Friday, Apr 29, 2016
tomo: Saturday, Apr 30, 2016

旧版课程

您正在使用旧的旧日期时间类,这些类已被证明设计不当,令人困惑且麻烦。它们也是可变的,导致代码逻辑中的缺陷。

java.time

旧的类已经被Java 8及更高版本中内置的java.time框架所取代。大部分功能都被后端移植到Java 6&amp; 7在ThreeTen-Backport项目中,并在ThreeTenABP项目中进一步适用于Android。

java.time类使用Immutable Object模式。不是改变(“改变”)对象,而是根据原始值创建一个新对象。

仅限日期,没有时间且没有时区,请使用LocalDate

另一个问题是时区。您的代码忽略了这个关键问题。确定“今天”需要一个时区,作为全球各地的日期。如果省略,则应用JVM的当前默认时区。最好是明确的。同上Locale,如下面的代码所示,最好是明确的,而不是依赖于JVM的当前默认值。

这是我的代码版本,没有循环。

提示:通常最好先构建和组织业务对象(此处为LocalDate个对象),与演示文稿(String值)分开显示。

ZoneId zoneId = ZoneId.of ( "America/Montreal" );
LocalDate today = LocalDate.now ( zoneId );

LocalDate yesterday = today.minusDays ( 1 );
LocalDate dayBeforeYesterday = yesterday.minusDays ( 1 );

LocalDate tomorrow = today.plusDays ( 1 );
LocalDate dayAfterTomorrow = tomorrow.plusDays ( 1 );

List<String> days = new ArrayList<> ( 5 );
DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedDate ( FormatStyle.MEDIUM );
formatter = formatter.withLocale ( Locale.US );  // Or Locale.CANADA, LOCALE.CANADA_FRENCH.
days.add ( dayBeforeYesterday.format ( formatter ) );
days.add ( yesterday.format ( formatter ) );
days.add ( today.format ( formatter ) );
days.add ( tomorrow.format ( formatter ) );
days.add ( dayAfterTomorrow.format ( formatter ) );

System.out.println ( "today: " + today );
System.out.println ( "days: " + days );

跑步时。

today: 2016-04-30
days: [Apr 28, 2016, Apr 29, 2016, Apr 30, 2016, May 1, 2016, May 2, 2016]