回答編集履歴

1

期待値と入力が逆だった模様

2019/11/15 16:36

投稿

swordone
swordone

スコア20651

test CHANGED
@@ -1,4 +1,6 @@
1
+ 調べてみたところ、1451606400000はエポックから**GMT2016年1月1日 0時0分0秒00ミリ秒のミリ秒**ということがわかりました。つまり、このシステムではGMTがデフォルトのタイムゾーンのようです。
2
+
1
- 日本国内システム実行したならたいていデフォルトのタイムゾーンは日本になっており、SimpleDateFormatやCalendarのタイムゾーンもそれに従うため、
3
+ 状態で、日本時間2016年1月1日 0時0分0秒00ミリ秒しろということのようです。SimpleDateFormatやCalendarのタイムゾーンもそれに従うため、
2
4
 
3
5
  ```java
4
6
 
@@ -6,10 +8,22 @@
6
8
 
7
9
  ```
8
10
 
9
- この時点でこれは**日本時間の2016年1月1日 0時0分0秒00ミリ秒**を表します。
11
+ この時点でこれは**GMT2016年1月1日 0時0分0秒00ミリ秒**を表します。
10
12
 
11
- このときGMTは**9時間=32400000ミリ秒**進んだ時刻**2016年1月1日 9時0分0秒00ミリ秒**になっています。
13
+ このとき日本時間は**9時間=32400000ミリ秒**進んだ時刻**2016年1月1日 9時0分0秒00ミリ秒**になっています。
14
+
15
+ そしてDateはGMTベースのミリ秒で時刻を管理しますので、この**2016年1月1日 9時0分0秒00ミリ秒**の時刻を持ちます。つまり、**期待値より32400000ミリ秒多い時間**が得られてしまうのです。
12
16
 
13
17
 
14
18
 
15
- そしてDateはGMTベスのミリ秒で時刻管理しますので、この**2016年1月1 9時0分0秒00ミリ秒**の時刻を持ちま。つま、**期待値より32400000ミリ秒多い時間**が得られてしうのです。
19
+ 変換の時点で日本時間と解釈させるためには、SimpleDateFormatが持つタイムゾーン(正確にSimpleDateFormatの内部のCalendarが持つタイムゾン)を日本にる必要があります。
20
+
21
+ ```java
22
+
23
+ //Dateクラスインスタンスを生成
24
+
25
+ SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss")
26
+
27
+ .setTimeZone(TimeZone.getTimeZone("JST"));
28
+
29
+ ```