java - 将日期设置为选项卡

标签 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

最佳答案

逻辑错误

您的代码背后的逻辑不正确。例如,今天是 30 号。当您的代码到达“今天”时,您已经从中删除了两天。所以你的代码让它看起来像“今天”是 28 号。

此外,在这两个循环之间,您生成 todate 的地方不会调用带有 -1add,因此日期保持不变作为最后一次通过第一个循环。

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

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

旧类(class)已被 java.time 取代框架内置于 Java 8 及更高版本中。其中大部分功能在 ThreeTen-Backport 项目中被反向移植到 Java 6 和 7,并在 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]

关于java - 将日期设置为选项卡,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36952116/

相关文章:

android - Xamarin.Forms:从 Iconize 创建一个圆形/圆形按钮

python - 如何从另一个 DataFrame 添加数据,其中不同的日期粒度匹配?

validation - Extjs 日期字段从 到 或开始结束日期验证

java - Spring 安全 : Java Config does not work

java - 将十六进制(或二进制)数据放入 Java 字符串中

java - 从二维整数数组中查找最常见的值

java - 在 pyspark 中包装一个 java 函数

android - 为什么不调用 Volley 的 onResponse

java - onResume() 和 onPause() 在第一次启动时被调用

php - 比较 mysql 日期时间和 php YY