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

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

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

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

Q&A

解決済

2回答

2502閲覧

タイムスタンプの作成についてどうしても数字が合わない

javaknow8282

総合スコア13

Java

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

0グッド

0クリップ

投稿2019/11/15 15:46

編集2019/11/15 15:47

▼何をしたいのか
「2016年1月1日 0時0分0秒00ミリ秒」の情報を持つDateクラスインスタンスの生成。
その後、1970 年 1 月 1 日 00:00:00 GMT からの経過時間をミリ秒数で表示。

※タイムゾーンをJSTにする処理と、ミリ秒を指定する処理が必要。

▼何が起こっているのか
入力値
1451606400000
期待値
1451574000000

どうしても合わなく困っています。

▼現状の認識・調べたこと
タイムゾーンをJSTにする処理と、ミリ秒を指定する処理が間違っているのかと思いましたが原因究明ができません。

import java.util.Date; import java.text.SimpleDateFormat; import java.text.ParseException; import java.util.Calendar; import java.util.TimeZone; public class Main { public static void main(String[] args) throws ParseException{ //Dateクラスインスタンスを生成 SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); Date day = sdf.parse("2016/1/1 0:0:0.0"); //ミリ秒を指定 Calendar c = Calendar.getInstance(); c.get(Calendar.MILLISECOND); //タイムゾーンをJSTにする処理 TimeZone t = TimeZone.getTimeZone("JST"); c.setTimeZone(t); System.out.print(day.getTime()); } }

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

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

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

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

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

ngsvx

2019/11/15 16:05

System.out.print(day.getTime()); ですが、dayに対しては、最初の設定以外に更新していないので、2016/1/1 0:0:0.0のままですが、 それで期待通りなのでしょうか?
gentaro

2019/11/15 16:15

「期待値」はともかく「入力値」がどれを指してるのかイマイチよくわからん。(その数値をコード上で指定してる箇所はない) 普通書くなら「期待値」と「出力値」(が違うから困ってる)という話になる気がする。 「出力」ならSystem.out.print()の箇所だというのは理解できる。 ぱっと見た感じ「1451606400000」と「1451574000000」で9時間(GMTとJSTの差と同じだけ)ズレてるから、まぁタイムゾーンの指定で困ってるんだろうなとは思うけど、それ以前にこのコードの意図として「どの箇所(処理)で、それぞれどういう動作をすると思って書いたのか」まで説明をしないと、どこで間違ってるとかの指摘は難しい気が。(意図がわかんないので)
guest

回答2

0

ベストアンサー

調べてみたところ、1451606400000はエポックからGMT2016年1月1日 0時0分0秒00ミリ秒のミリ秒ということがわかりました。つまり、このシステムではGMTがデフォルトのタイムゾーンのようです。
その状態で、日本時間2016年1月1日 0時0分0秒00ミリ秒にしろということのようです。SimpleDateFormatやCalendarのタイムゾーンもそれに従うため、

java

1 Date day = sdf.parse("2016/1/1 0:0:0.0");

この時点でこれはGMT2016年1月1日 0時0分0秒00ミリ秒を表します。
このとき日本時間は9時間=32400000ミリ秒進んだ時刻2016年1月1日 9時0分0秒00ミリ秒になっています。
そしてDateはGMTベースのミリ秒で時刻を管理しますので、この2016年1月1日 9時0分0秒00ミリ秒の時刻を持ちます。つまり、期待値より32400000ミリ秒多い時間が得られてしまうのです。

変換の時点で日本時間と解釈させるためには、SimpleDateFormatが持つタイムゾーン(正確にはSimpleDateFormatの内部のCalendarが持つタイムゾーン)を日本にする必要があります。

java

1 //Dateクラスインスタンスを生成 2 SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss") 3 .setTimeZone(TimeZone.getTimeZone("JST"));

投稿2019/11/15 16:09

編集2019/11/15 16:36
swordone

総合スコア20651

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

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

swordone

2019/11/15 16:14

書いててロジックが合わないことに気づきましたが、誤差である「32400000ミリ秒」に関してはこれで正しいはずなので、このまま置いて考えます。
javaknow8282

2019/11/15 16:22

期待値に合わせるにはミリ秒を指定する処理が必要ということでしょうか?
xebme

2019/11/15 20:11

デフォルトのタイムゾーンがGMTだったのですね。
guest

0

質問の推測

SimpleDateFormatだけでできることをCalendarも使ってやろうとして混乱しているようです。

Java

1//Dateクラスインスタンスを生成 2SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); 3Date day = sdf.parse("2016/1/1 0:0:0.0"); 4System.out.print(day.getTime());

ここではGMTに+9時間を加えたJST(デフォルト)の時刻が得られます。この値がGMTだと思いCalendarを使えばJSTになると思いこんでいるので困った。これが質問の推測です。

以下の結果は9時です。

Java

1System.out.println(new Date(0l));

UTC時刻の取得

UTC時刻やJST時刻を直接得るにはどうするか? ISO8601フォーマットが使える。

Java

1SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSSSSSX"); 2Date utc = sdf.parse("2016-01-01T00:00:00.0000000Z"); // UTC 3Date jst = sdf.parse("2016-01-01T00:00:00.0000000+0900"); // JST

追記

デフォルトがGMTなら質問のつじつまが合うことに思いいたりませんでした。
(また、UNIXエポックではなく、UTCベースのDate Time APIがJava 8 から追加されています。)

投稿2019/11/15 17:25

編集2019/11/15 21:22
xebme

総合スコア1081

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問