Quantcast
Channel: Oracle Blogs 日本語のまとめ
Viewing all articles
Browse latest Browse all 760

[Java] A new (Japanese) era for Java! 

$
0
0
原文はこちら。
https://blogs.oracle.com/java-platform-group/a-new-japanese-era-for-java

2019年現在、日本では、世界のほとんどの国と同じ西暦紀元のカレンダー(西暦)を日常生活で使っています。公的文書や公式文書で使われる和暦では、月と日は同じものの、時代名称(元号)と元号内の年数は西暦とは異なるものを使います。現在の日本の時代は平成(Heisei)で、2019年は平成31年に相当します。
現代の日本では、元号は新天皇の即位とともに始まり、その元号は次の天皇の即位まで続きます。例えば、明治(Meiji)という元号は1912年7月30日(明治45年7月30日)まで続きましたし、その次の元号である大正(Taisho)は1912年7月31日の大正天皇の即位とともに始まりました(天皇の崩御後、その天皇は統治した時代を使って表現されます)。この日付は大正1年7月31日と思われるでしょうが、新時代の最初の年を常に元年(Gan-nen)と呼ぶため、大正元年7月31日と表現します。新天皇が1月1日に即位しない限り、最初の年(つまり元年)は12月31日に終了するため、始まった日にかかわらず、新時代の元年は1暦年よりも短くなることにご注意ください。
2016年に今上天皇 明仁が皇太子 徳仁に譲位する予定であることを発表しました。今上天皇は2019年4月30日(平成31年4月30日)に退位する予定で、2019年4月1日に日本の内閣が、2019年5月1日から始まる新しい元号名を発表することになっています。
この新しい元号に備えるための手順をとってきましたが、新元号の発表までこのアップデートの最終化は待つ必要があります。
特にJDKにおいてはいくつかの変更があります。
  • グレゴリオ暦の日付を和暦に相当する日付に変換してテキストとして表示する場合、正しい元号名を知っておく必要があります。
  • 逆変換、つまり文字列表記の日付を正しい日時に変換する場合には、元号名称を解析し、どの西暦に相当するのかを知っておく必要があります。
  • Unicodeは、新しい元号名称を表現する合字を新たに追加します。
JDK 8以降、Java APIには新しいDate and Time API(JSR 310を参照)のほか、古いjava.util.Calendarクラスに日付を処理するためのメソッドが追加されました。すべての関連APIは、新しい時代を正しく処理するように更新されてきました。
JSR 310: Date and Time API
https://jcp.org/en/jsr/detail?id=310
新元号に備えて、JDK 12では新元号( “NewEra”)のプレースホルダー名を使用します。JDK 12を使用すると、新元号発表後にリリースされるアップデートで、新元号名がどのように処理されるのかがわかります。
新元号の発表後の次のアップデートリリースは2019年4月16日(PDT)を予定しています。すべてのサポート対象のJDKである7、8、11 LTS、そして12が新しい元号を扱えるようにアップデートされます。
これらのすべてのバージョンの中で、java.util.Calendarクラスは正しい値を理解し、返すためにアップデートされます。
import java.util.*;
import java.text.*;

...

new SimpleDateFormat("GGGGy 年M ⽉d ⽇",
Locale.forLanguageTag("ja-JP-u-ca-japanese")).
format(new Calendar.Builder().
setDate(2019, Calendar.MAY, 1).build().getTime());

// before the update: 平成31 年5 ⽉1 ⽇,
// after the update: 元号元 年5 ⽉1 ⽇
// On versions released after new announcement the 元号 will be replaced with the new era name
そしてjava.text.SimpleDateFormatを使った日付のパースは正しく動作します。
import java.text.*;

...

var sdf = new SimpleDateFormat("GGGGy 年M ⽉d ⽇",
Locale.forLanguageTag("ja-JP-u-ca-japanese"));
sdf.setLenient(false);
new SimpleDateFormat("Y-M-d", Locale.US).format(sdf.parse("元号2 年2 ⽉1 ⽇"));
// => "2020-2-1"
// with 元号 replaced with the new era name
JDK 8以後については、JSR 310 Data and Time APIもアップデートします (このAPIはJDK 7には含まれていません)。
import java.time.chrono.*;
import java.time.format.*;
import java.time.temporal.*;

...

DateTimeFormatter.ofPattern("GGGGy 年M ⽉d ⽇").
withChronology(JapaneseChronology.INSTANCE).
withLocale(Locale.JAPAN).
format(JapaneseDate.of(2020, 2, 1));
// => “元号2 年2 ⽉1 ⽇”

DateTimeFormatter.ofPattern("u-M-d").format(
DateTimeFormatter.ofPattern("GGGGy 年M ⽉d ⽇").
withChronology(JapaneseChronology.INSTANCE).
withLocale(Locale.JAPAN).
withResolverStyle(ResolverStyle.STRICT).
parse("元号2 年2 ⽉1 ⽇"));
// => “2020-2-1”


JapaneseEra.of(3).getDisplayName(TextStyle.FULL,
Locale.forLanguageTag("ja-JP-u-ca-japanese"));
// => “元号”
// with 元号 replaced with the new era name
JDK 8以後では、Unicodeコードポイント U+32FF がjava.util.Calendar クラスに入ります。このコードポイントは新元号の合字用に予約されています。

まとめると、以下の通りです。
  • 日本の新元号の発表後リリースされるJDKのアップデートで、新元号を正しく取り扱えるようにする
  • 新元号発表までは、JDK 12(そしてJDK 11も)は将来の挙動と同様ではあるものの、元号をプレースホルダー名(*)として使用する。
(*)文字列形式の日付のパースに問題があるため、パースが正しく機能するための4月のアップデートまで待つ必要があります。
[JDK-8217609] New era placeholder not recognized by java.text.SimpleDateFormat
https://bugs.openjdk.java.net/browse/JDK-8217609

Viewing all articles
Browse latest Browse all 760

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>