不正なロジック
あなたのコードの背後にある論理は間違っています。今日は例えば30日です。あなたのコードが「今日」になった時点で、あなたはすでに2日を削除しています。だからあなたのコードは "今日"のように見える28番目です。
todate
を生成する2つのループの間にadd
を-1
と呼ぶことはないため、日付は最初のループの最後の時刻と同じになります。
コードをコピーし、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フレームワークに取って代わられています。その機能の多くは、ThreeTen-BackportプロジェクトのJava 6 & 7にバックポートされ、さらにThreeTenABPプロジェクトのAndroidに適応しています。
java.timeクラスはImmutable Objectパターンを使用します。オブジェクトを変更(「変更」)するのではなく、元の値に基づいて新しいオブジェクトが作成されます。
時間のみがなくタイムゾーンがない場合は、LocalDate
を使用してください。
別の問題はタイムゾーンです。あなたのコードはこの重要な問題を無視しています。 「今日」を決定するには、世界中のさまざまな日付としてタイムゾーンが必要です。省略すると、JVMの現在のデフォルトのタイムゾーンが適用されます。明示的にすることをお勧めします。 Locale
のDittoは、以下のコードで見られるように、JVMの現在のデフォルトに頼るよりも明示的である方が良いです。
ここに私のバージョンのコードがあり、ループはありません。
ヒント:通常は、最初に構築および整理されたビジネスオブジェクト(ここではオブジェクト)を取得するのが最適です。プレゼンテーションとは別に保存されます(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]
回答を受け取るためには、 'javascript'タグを削除し、' java'asタグを追加する必要があります。これはjavascriptとは関係ありません。 – marvinhagemeister