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)
Java時間API
旧バージョンAPI
旧バージョンのAPIは Dateは、日付と時刻のオブジェクトを表します.現在時刻や対応する年月日時分秒などを取得できます. Calendarは、Dateよりも時間演算が多く、年月日を取得および設定できます. TimeZoneタイムゾーン変換機能詳細リファレンス:廖雪峰-DateとCalendar 時間の書式設定
フォーマットの詳細については、JDKドキュメント:Class SimpleDateFormat
Java 8の新しいバージョンAPI
新しい時間APIは
カテゴリ
API
ローカル日付時刻
時刻
時間間隔
タイムゾーンを含む時間
タイムゾーン
時刻(Instant)
タイムスタンプの取得
タイムスタンプを特定のタイムゾーン時間に変換
タイムオブジェクトの作成
上記2つの時間オブジェクトは、標準ISO 8601のフォーマットを出力する
DurationとPeriod
出力内容は似ています:
新しいタイムフォーマット(DateTimeFormatter)
新しいAPIでは、廖雪峰-LOcalDateTimeを参照して、より強力な日付計算方法も提供されています.
タイムゾーン時間
出力は次のとおりです.
データベースに日付と時刻を格納
データベースにunixタイムスタンプを保存し、ユーザーが選択したタイムゾーンに基づいてローカル時間を表示できます.
出力は次のとおりです.
ISO 8601
ISO 8601で定められている日時区切り記号は日付: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
epoch time
は、特定の時間:1970-01-01 00:00:00 UTC
を表し、この時点から算出された秒数をUNIXタイムスタンプ(Unix timestamp)と呼ぶ.JavaではSystem.currentTimeMillis()
を使用してタイムスタンプを取得できます.Java時間API
旧バージョンAPI
旧バージョンのAPIは
java.util
パッケージにあります.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とPeriod
Duration
は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.412S
P1D
.出力フォーマット: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
中国語English