Javaベース:日付と時刻


文書ディレクトリ
  • 日付と時間
  • 新紀元時間(Epoch Time)
  • Java時間API
  • 旧バージョンAPI
  • Java 8の新しいバージョンAPI
  • 時刻(Instant)
  • 時間オブジェクト
  • を作成
  • DurationとPeriod
  • 新しいタイムフォーマット(DateTimeFormatter)
  • タイムゾーン付き時間
  • データベースに日付と時刻
  • を格納する.
  • ISO 8601
  • APIドキュメント
  • 日付と時刻
  • 日付は2020-06-17
  • 時間(日付を含むことができる)例えば12:10:10または2020-06-17 12:10
  • 新紀元時間(Epoch Time)epoch timeは、特定の時間:1970-01-01 00:00:00 UTCを表し、この時点から算出された秒数をUNIXタイムスタンプ(Unix timestamp)と呼ぶ.JavaではSystem.currentTimeMillis()を使用してタイムスタンプを取得できます.
    Java時間API
    旧バージョンAPI
    旧バージョンのAPIはjava.utilパッケージにあります.
  • Dateは、日付と時刻のオブジェクトを表します.現在時刻や対応する年月日時分秒などを取得できます.
  • Calendarは、Dateよりも時間演算が多く、年月日を取得および設定できます.
  • TimeZoneタイムゾーン変換機能詳細リファレンス:廖雪峰-DateとCalendar
  • 時間の書式設定
    Date date = new Date();
    var sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    System.out.println(sdf.format(date));
    

    フォーマットの詳細については、JDKドキュメント:Class SimpleDateFormat
    Java 8の新しいバージョンAPI
    新しい時間APIはjava.timeパケットにあり、主なAPIは以下のものを含む.
    カテゴリ
    API
    ローカル日付時刻LocalDateTime , LocalDate , LocalTime
    時刻Instant
    時間間隔Duration
    タイムゾーンを含む時間ZonedDateTime
    タイムゾーンZoneId , ZoneOffset
    時刻(Instant)
    タイムスタンプの取得
    //  
    instant.getEpochSecond()
    //   
    instant.toEpochMilli()
    

    タイムスタンプを特定のタイムゾーン時間に変換
    Instant ins = Instant.ofEpochSecond(1592385860);
    System.out.println(ins);    // UTC   
    ZonedDateTime zonedDateTime = ins.atZone(ZoneId.systemDefault());
    ZonedDateTime zonedDateTime2 = ins.atZone(ZoneId.of("America/New_York"));
    

    タイムオブジェクトの作成
    LocalDateTime ldt = LocalDateTime.now();
    LocalDateTime ldt2 = LocalDateTime.of(2020, 6, 17, 12, 12, 12);
    

    上記2つの時間オブジェクトは、標準ISO 8601のフォーマットを出力する
    DurationとPeriodDurationは2つの時刻間の時間間隔を表し、Periodは2つの日付間の日数を表す
    LocalDateTime ldt = LocalDateTime.now();
    LocalDateTime ldt2 = LocalDateTime.of(2020, 6, 17, 12, 12, 12);
    Duration duration = Duration.between(ldt2, ldt);
    System.out.println(duration);
    Period period = Period.between(LocalDate.now().minusDays(1), LocalDate.now());
    System.out.println(period);
    

    出力内容は似ています:PT4H34M1.412SP1D.出力フォーマット:P...T...の形式で、P...Tの間は日付間隔を表し、Tの後は時間間隔を表す.従って、上記出力は、それぞれ4時間34分1.412秒、日付間隔1日を示す.
    新しいタイムフォーマット(DateTimeFormatter)
    DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
    System.out.println(dtf.format(LocalDateTime.now()));
    

    新しいAPIでは、廖雪峰-LOcalDateTimeを参照して、より強力な日付計算方法も提供されています.
    タイムゾーン時間
    ZonedDateTime beijingTime = ZonedDateTime.now(); //     
    ZonedDateTime newYorkTime = ZonedDateTime.now(ZoneId.of("America/New_York")); //     
    // or create by asZone
    ZonedDateTime beijingTime2 = ldt.atZone(ZoneId.systemDefault());
    ZonedDateTime newYorkTime2 = ldt.atZone(ZoneId.of("America/New_York"));
    

    出力は次のとおりです.
    2020-06-17T16:55:47.874+08:00[Asia/Shanghai]
    2020-06-17T04:55:47.876-04:00[America/New_York]
    
    withZoneSameInstant()を使用して、タイムゾーンをニューヨーク時間に変換することもできます.
    ZonedDateTime newYorkTime3 = beijingTime.withZoneSameInstant(ZoneId.of("America/New_York"));
    

    データベースに日付と時刻を格納
    データベースにunixタイムスタンプを保存し、ユーザーが選択したタイムゾーンに基づいてローカル時間を表示できます.
    public static void main(String[] args) {
        long unixTimestamp = 1592386268000L;
        String bj = timestampToString(unixTimestamp, Locale.CHINA, "Asia/Shanghai");
        String ny = timestampToString(unixTimestamp, Locale.US, "America/New_York");
        System.out.println(bj);
        System.out.println(ny);
    }
    static String timestampToString(long epochMilli, Locale locale, String zoneId) {
        Instant ins = Instant.ofEpochMilli(epochMilli);
    	// DateTimeFormatter dtf = DateTimeFormatter.ISO_DATE_TIME;
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        return dtf.withLocale(locale).format(ZonedDateTime.ofInstant(ins, ZoneId.of(zoneId)));
    }
    

    出力は次のとおりです.
    2020-06-17 17:31:08
    2020-06-17 05:31:08
    

    ISO 8601
    ISO 8601で定められている日時区切り記号はT
  • 日付:yyyy-MM-dd
  • 時間:HH:mm:ss
  • ミリ秒の時間:HH:mm:ss.SSS
  • 日時:yyyy-MM-dd’T’HH:mm:ss
  • ミリ秒の日付と時間:yyyy-MM-dd’T’HH:mm:ss.SSS
  • APIドキュメント
    中国語English