JavaのCalendarクラスのaddメソッドを使用して入力値の前日を取得する処理があります。
月をまたいだ場合(1日に実行した場合)、画像のような出力になってしまいました。
他の人の環境では正常に取得できるのですが、
環境構築の詳細な手順が標準化されておらず、何の差分があるのかわかりません。
原因に心当たりのある方、いらっしゃいますでしょうか。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

回答2件
0
ベストアンサー
以下のコードを走らせてみると
java
1import java.util.*; 2import java.text.SimpleDateFormat; 3 4public class Main { 5 public static void main(String[] args) throws Exception { 6 SimpleDateFormat format1 = new SimpleDateFormat("yyyymmdd"); 7 // 正しく"年/月/日 時:分:秒"として表示するためのフォーマッタ 8 SimpleDateFormat format2 = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); 9 Date date = format1.parse("2018-11-01"); 10 System.out.println(format2.format(date)); 11 } 12}
次のような結果が出ました。
plain
12017/12/31 23:59:00
そもそも入力の形式(yyyy-MM-dd)とFormatの形式が合わないので、読み込みがおかしくなっています。
具体的には、年(yyyy)を2018、分(mm)を-1、日(dd)を1と読み、あとの"-01"はフォーマットに合わないため無視されていると思われます。
plain
12018-11-01 2yyyymmdd
この結果、2018年1月1日0時-1分0秒として読み込みます。もちろんこんな時間は存在しないのですが、このクラスは非厳密に解釈をするため、2018年1月1日0時0分0秒の1分前として解釈します。
そのため、結果のような2017年12月31日23時59分0秒となるのです。
出力の際もyyyymmddで出力しているため、年の2017、分の59、日の31が使われ、あなたの表示
plain
1減算前:20175931
に至るわけです。
"2018-11-02"の場合も末尾の"-02"が無視されるため全く同じです。
解決法
入力にきちんと対応したFormatを用意しましょう。
java
1SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
なお、Java8以降では新しい日付時刻に関するクラス群があります。
java
1import java.util.*; 2import java.time.LocalDate; 3 4public class Main { 5 public static void main(String[] args) throws Exception { 6 LocalDate date = LocalDate.parse("2018-11-01").minusDays(1); 7 System.out.println(date); 8 } 9}
出力結果
plain
12018-10-31
投稿2018/11/15 12:01
編集2018/11/15 13:00総合スコア20675
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。