-5

文字列から日付を解析しようとしましたが、印刷すると悪い日付が表示されます。私のコード:

import java.util.Calendar;
import java.util.GregorianCalendar;
import java.text.SimpleDateFormat;

public class Main {
    public static void main(String args[]) {
        String some_date = "2017-12-31";
        Calendar cal_aux = GregorianCalendar.getInstance();
        System.out.println("set calendar: " + Integer.parseInt(some_date.substring(0, 4))
                + Integer.parseInt(some_date.substring(5, 7))
                + Integer.parseInt(some_date.substring(8, 10)));
        cal_aux.set(Integer.parseInt(some_date.substring(0, 4)),
                Integer.parseInt(some_date.substring(5, 7)),
                Integer.parseInt(some_date.substring(8, 10)));
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println("sdf calendar: " + sdf.format(cal_aux.getTime()));
    }
}

コンソール出力:

set calendar: 20171231
sdf calendar: 2018-01-31 12:51:02

単純な日付形式を使用すると、2017 年ではなく 2018 年になるのはなぜですか?

4

2 に答える 2

2

現在 java.time クラスに取って代わられている従来の日時クラスは避けてください。問題のあるレガシー クラスには多くの設計上の欠陥があります。そのような間違いの 1 つは、月を 1 ~ 12 ではなく 0 ~ 11 としてカウントすることです。このクレイジーなカウントは、コードを壊しています。

日時の値を文字列として操作しないでください。オブジェクトを使用します。

その日付のみの値には、 を使用しますLocalDate

LocalDate ld = LocalDate.parse( "2017-12-31" )  ;  // Or LocalDate.now() for today's date.

を使用して文字列を生成しDateTimeFormatterます。

String output = ld.format( DateTimeFormatter.BASIC_ISO_DATE ) ;

20171231

必要に応じて時刻を割り当てます。

LocalTime lt = LocalTime.of( 6 , 15 ) ;
LocalDateTime ltd = LocalDateTime.of( ld , lt ) ;

実際の瞬間、タイムライン上の特定のポイントが必要な場合は、タイム ゾーンを適用します。

ZoneId z = ZoneId.of( "Africa/Casablanca" ) ;
ZonedDateTime zdt = ldt.atZone( z ) ;
于 2017-11-08T17:25:21.403 に答える