我正在尝试将当前日期显示在我的标签上,但左边的日期并没有减少一个。我究竟做错了什么?任何帮助将不胜感激,谢谢。
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);
}
答案 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 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]