質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

2回答

4612閲覧

【Java】InstantクラスとLocalDateTimeクラスの違いとInstantクラス、エポック秒について

kazu0630

総合スコア26

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2020/04/27 15:22

いつもお世話になっております。

全体的に理解が浅いので、変な質問でしたら、申し訳ありません。

早速表題の件ですが、Instantクラスは単一の時点を表すという認識です。
LocalDateTimeでも、
LocalDateTime ldt = LocalDateTime.now();

LocalDateTime ldt = LocalDateTime.of(2020,04,28,0,0,0);
でも単一の時点を表していると考えております。

①上記の例でも単一の時点を表すと言えないのでしょうか。

また、Instantクラスはエポック秒を保持するとjavadocには記載してありますが、
Instant instant = Instant.now();
を行った場合、エポック秒が出力されないと思います。
※出力例:2020-04-27T15:05:16.353Z

②Instantクラスが保持するエポック秒はどのようにして取得するのでしょうか。
以下のようにすると、1970年1月1日午前0時0分0秒からの秒数が出力されるのかと思いましたが、前述の日時に引数で指定した値を加算した値が出力されました。

③これがエポック秒なのでしょうか。
例:System.out.println(Instant.ofEpochMilli(10));
出力:1970-01-01T00:00:00.010Z

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

Instant クラスは、フィールド変数に 「秒,ナノ秒」を保持。
LocalDateTime クラスは、「年,月,日,時,分,秒,ナノ秒」を保持。
この事から単純に、エポック秒から年月日への変換コストを気にして、分けたクラスに見えます。
「単一の時点」は、後付けの理由のように思えます。

"Instant" という名前でなく、"EpochSecond" とかいう名前なら理解しやすいと思いました。

ソースを見ると、理解しやすいです。
http://hg.openjdk.java.net/jdk8/jdk8/jdk/file/687fd7c7986d/src/share/classes/java/time/Instant.java
http://hg.openjdk.java.net/jdk8/jdk8/jdk/file/687fd7c7986d/src/share/classes/java/time/LocalDateTime.java

①~③は、上記の件が整理できなくて出てきた疑問なようなので、スルーしました。

投稿2021/04/19 10:39

aa_

総合スコア2

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

LocalDateTime ldt = LocalDateTime.of(2020,04,28,0,0,0);

でも単一の時点を表していると考えております。

いいえ、LocalDateTimeだけでは単一の時点を表せません。同じ2020年4月28日0時0分0秒だとしても、それが「東京」と「ニューヨーク」では違う時点になります。
タイムゾーン込みのZonedDateTimeであれば単一の時点を表すとも考えられますが、同じ時点を表す複数の表現を取ることができてしまい(東京の2020年4月28日0時0分0秒とニューヨークの2020年4月27日11時0分0秒)、ある時点について考えるにあたって不便です。サマータイムなどの問題もありますしね。

Instant instant = Instant.now();

を行った場合、エポック秒が出力されないと思います。
※出力例:2020-04-27T15:05:16.353Z

「保持する」のは間違いなくエポック秒です。ただし、表示するにあたってエポック秒そのまま表示したのでは意味が分かりにくいため、UTCでの時刻の形で表示する仕様になっています。

②Instantクラスが保持するエポック秒はどのようにして取得するのでしょうか。

以下のようにすると、1970年1月1日午前0時0分0秒からの秒数が出力されるのかと思いましたが、前述の日時に引数で指定した値を加算した値が出力されました。

③これがエポック秒なのでしょうか。
例:System.out.println(Instant.ofEpochMilli(10));
出力:1970-01-01T00:00:00.010Z

「エポック秒」の定義は「UTCでの1970年1月1日午前0時0分0秒からの経過秒数」です。前述の通りInstantを出力する際はUTCでの時刻の形式で表示することになっているため、③のように「10ミリ秒のエポック秒」を与えれば、それを出力する際には「UTCでの1970年1月1日午前0時0分0秒から10ミリ秒経過した時刻」を表示します。

投稿2020/04/27 16:28

swordone

総合スコア20669

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kazu0630

2020/04/28 01:54 編集

ご回答いただき、ありがとうございます。 >いいえ、LocalDateTimeだけでは単一の時点を表せません。同じ2020年4月28日0時0分0秒だとして、それが「東京」と「ニューヨーク」では違う時点になります。 >タイムゾーン込みのZonedDateTimeであれば単一の時点を表すとも考えられますが、同じ時点を表す複数の表現を取ることができてしまい(東京の2020年4月28日0時0分0秒とニューヨークの2020年4月27日11時0分0秒)、ある時点について考えるにあたって不便です。サマータイムなどの問題もありますしね。 確かに仰る通り、単一の時点を表しているとは言えませんね。 ちなみにInstantクラスはどこの地域の単一の時点を表しているのでしょうか。(UTCでしょうか?) >「保持する」のは間違いなくエポック秒です。ただし、表示するにあたってエポック秒そのまま表示したのでは意味が分かりにくいため、UTCでの時刻の形で表示する仕様になっています。 UTCでの時刻を表示することで、「エポック秒=UTCでの時刻-エポック」で表示するよりも分かりやすいということでしょうか。 例えば「UTCでの2020年1月1日午前4時0分0秒」であれば、エポックから50年と14400秒経過しているということが比較的分かりやすくなりますが、 「エポック秒=UTCでの時刻-エポック」 で表示するとかなりの桁数になり、エポックからの経過時間が分かりにくいということでしょうか。 大変申し分かりませんが、もう少しご教示願えませんでしょうか。
swordone

2020/04/29 05:25 編集

> ちなみにInstantクラスはどこの地域の単一の時点を表しているのでしょうか。(UTCでしょうか?) どの地域のものでもありません。 UTCで1970年1月1日午前0時0分0秒のとき、 東京では1970年1月1日午前9時0分0秒、 ニューヨークでは1969年12月31日午後7時0分0秒で、 これらはいずれも「エポック秒で0秒」です。
kazu0630

2020/04/29 09:00

ご回答いただき、ありがとうございます。 教えていただきました考え方で、納得することができました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問