山崎屋の技術メモ

IT業界で働く中で、気になること、メモしておきたいことを書いていきます。

【未解決】LocalDate から Date への変換で怪現象

趣味で西暦・和暦変換処理を作っていて不思議な現象にあいました。

LocalDate を Date に変換する必要があったので、ネットで調べたらいくつかのサイトがヒットしました。

String、Date、LocalDateの変換 - Qiita

java.util.Date型にjava.time.LocalDateを変換する | CODE Q&A [日本語]

簡単なサンプルを試しました。

	public static void main(String[] args) throws Exception {
		LocalDate ld = LocalDate.of(2018, 3, 24);
		Date date = Date.from(ld.atStartOfDay(ZoneId.systemDefault()).toInstant());
		System.out.println(date);
	}

実行結果。

Sat Mar 24 00:00:00 JST 2018

なんの問題もないですね。解決・・・

と思っていたのですが、大昔の変換も行う必要があるので、ひとまず 1850 年で試しました。

	public static void main(String[] args) throws Exception {
		LocalDate ld = LocalDate.of(1850, 1, 1);
		Date date = Date.from(ld.atStartOfDay(ZoneId.systemDefault()).toInstant());
		System.out.println(date);
	}

実行結果。

Mon Dec 31 23:41:01 JST 1849


ずれとるやないかい!!!!!!!!!


いろいろな日付で試してみるとどうやら 1888 年 1 月 1 日以前だと 18 分 59 秒ずれるみたいです。1888 年 1 月 2 日だとずれません。

ググってみたけれど同じ現象で困っている人は見つけられませんでした。

とりあえず、いったん文字列に変換することで、怪現象を回避した処理は作れたので、原因は継続調査ということにしておきたいと思います。

Java はちょっと古めの 1.8 です。詳細は下記参照。

C:\Users\yyama>java -version
java version "1.8.0_161"
Java(TM) SE Runtime Environment (build 1.8.0_161-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.161-b12, mixed mode)

解決したら追記します。

スッキリわかるJava入門 第2版 (スッキリシリーズ)

スッキリわかるJava入門 第2版 (スッキリシリーズ)

リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック (Theory in practice)

リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック (Theory in practice)

  • 作者: Dustin Boswell,Trevor Foucher,須藤功平,角征典
  • 出版社/メーカー: オライリージャパン
  • 発売日: 2012/06/23
  • メディア: 単行本(ソフトカバー)
  • 購入: 68人 クリック: 1,802回
  • この商品を含むブログ (138件) を見る
増補改訂版Java言語で学ぶデザインパターン入門

増補改訂版Java言語で学ぶデザインパターン入門