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

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

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

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

Q&A

解決済

3回答

4304閲覧

ロケールを日本に設定しているのに曜日などが英語表記される

a2606

総合スコア22

Java

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

0グッド

0クリップ

投稿2018/01/04 17:12

###質問内容
こちらのサイトを参考に、SimpleDateFormatクラスを使用して、
デフォルト(日本)の時刻をformatメソッドで表したところ、
パターン文字 a(午前/午後) , E(曜日)の箇所が、漢字ではなく英語で表示されてしまいました。

▼期待結果
2011年08月30日 火曜日
午後 01:51:52 651

▼実際の表示
2018年01月05日 Fri曜日
AM 01:05:53 484

ソースコードをそのまま貼り付けて作成しているため、
ソース内にミスが有るとは考えづらく、
こちらは、何が原因となって異なる表示になってしまっているのでしょうか?

また、自身ではAPIの仕様が変更されているのではないかと推測し、
使用しているJavaSE8と、前バージョンのSimpleDateFormatの
APIドキュメントを見比べてみましたが、それらしい記述を発見することが出来ませんでした。

###該当のソースコード

java

1import java.util.Calendar; 2import java.text.SimpleDateFormat; 3 4public class SimpleDateFormatSample { 5 public static void main(String args[]) { 6 7 //現在日時を取得する 8 Calendar c = Calendar.getInstance(); 9 10 //フォーマットパターンを指定して表示する 11 SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 E曜日"); 12 System.out.println(sdf.format(c.getTime())); 13 14 //フォーマットパターン変更して表示する 15 sdf.applyPattern("a hh:mm:ss SSS"); 16 System.out.println(sdf.format(c.getTime())); 17 18 } 19}

###補足情報
LocaleクラスのgetDefaultメソッドを使用して、
自身のパソコンの言語コード、国コードを確認すると、
「日本語」、「日本」が設定されている事を確認しております。

【環境】
OS : macOS High Sierra (10.13.2)
IDE : Eclipse Oxygen.1a Release (4.7.1a)
JRE : 1.8.0_144

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

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

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

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

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

guest

回答3

0

ベストアンサー

Macintosh環境でないので参考にならないかもですが・・・

自分の環境はWindows10なのですが似たようなこと(?)が起きました。

  1. Windows10にインストールしているWindows用のJDK(jdk9)を用いてcygwin上から実行すると期待通りになります。

2018年01月05日 金曜日
午前 09:44:49 190

  1. WSL(Windows Subsystem for Linux)上のopenjdk-9で実行すると

2018年01月05日 Fri曜日
AM 09:44:49 190
(LANG=ja_JP.UTF-8)

1.はWindows用のJDKなのでWindows設定からロケールを読み込めているのだろうと思いました。一方2.の方はサポートされているロケールにそもそもjaが入ってませんでした。LANG=ja_JP.UTF-8を設定してもダメのようです。

bash

1$ locale -a 2C 3C.UTF-8 4POSIX 5en_US.utf8

JRE内部には日本語ロケール用の情報が含まれているような気がしたのでロケールの設定方法について調べ以下のようにしてみると期待通りになりました。(ちなみにTZも未設定だったのでexport TZ=Asia/Tokyoに設定しました)

bash

1$ export _JAVA_OPTIONS="-Duser.language=ja -Duser.country=JP" 2$ java SimpleDateFormatSample 32018年01月05日 金曜日 4午前 10:09:26 739

WSLはまだできたてのため色々いけてない部分が多いのだろうと思います。Macintoshではどうなのかわかりませんが、過去色々とみた限りではデフォルトでjavacがうまく日本語を認識してくれないみたいな記事も見かけましたので、「何も考えなくても自動的にうまくいく」ようにはなってない部分があるのかも知れません・・・


追記:

Macintoshではどうなのかわかりませんが

と言いましたがMacじゃなくてMac用のJREがいけてないのかも・・・という気もします。

投稿2018/01/05 01:13

編集2018/01/05 01:24
KSwordOfHaste

総合スコア18392

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

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

mit0223

2018/01/05 01:38 編集

> Macintoshではどうなのかわかりませんが、 こちらで Macintosh で実験してみました。 export _JAVA_OPTIONS="-Duser.language=ja -Duser.country=JP" を実行後私の回答のプログラムを動かすと、 $ java SimpleDateFormatSample Picked up _JAVA_OPTIONS: -Duser.language=ja -Duser.country=JP [, 日, 月, 火, 水, 木, 金, 土] 2018年01月05日 金曜日 午前 10:32:07 181 と出力され、デフォルトの DateFormatSymbols が書き換わっていることを確認できました。ソースコードを変更する必要がなく、この回答のほうがスマートだと思います。
KSwordOfHaste

2018/01/08 13:59

実験結果のコメントありがとうございます。コメントいただいてたの気づいてなくて失礼しました。 Unix系のOSだとなんとなく「環境変数などによってよきに計らってくれる」ようなイメージがあったのですが、今回の件だと「JVMのオプションを指定すると期待通りになる」が「それを指定してないと必ずしも期待どおりにならないことがある」ということになり、逆にすっきりしない気もします・・・何が正しい設定なのか難しいです。
guest

0

クラス SimpleDateFormat を見ると曜日の例が

Tuesday; Tue

となっています。また

注:このコンストラクタはすべてのロケールをサポートするわけではありません。すべてをカバーするには、DateFormat クラスのファクトリメソッドを使用してください。

とあります。

クラス DateFormat を確認してみてください。

投稿2018/01/05 00:54

編集2018/01/05 00:55
Zuishin

総合スコア28656

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

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

0

おそらく、 Mac 版の機能不足なんだと思います。
sun.text.resources.FormatData あたりの日本語用リソースがどこかにあって、そっちにパッチをあてることもできるかもしれませんが、以下のようなコードで回避するのはいかがでしょうか。

java

1import java.util.Calendar; 2import java.text.SimpleDateFormat; 3import java.text.DateFormatSymbols; 4import java.util.Arrays; 5 6public class SimpleDateFormatSample { 7 public static void main(String args[]) { 8 9 //現在日時を取得する 10 Calendar c = Calendar.getInstance(); 11 DateFormatSymbols dfs = DateFormatSymbols.getInstance(); 12 System.out.println(Arrays.toString(dfs.getShortWeekdays())); 13 String swd[] = {"", "日", "月", "火", "水", "木", "金", "土"}; 14 dfs.setShortWeekdays(swd); 15 16 //フォーマットパターンを指定して表示する 17 SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 E曜日", dfs); 18 System.out.println(sdf.format(c.getTime())); 19 20 //フォーマットパターン変更して表示する 21 sdf.applyPattern("a hh:mm:ss SSS"); 22 System.out.println(sdf.format(c.getTime())); 23 24 } 25}

System.out.println(Arrays.toString(dfs.getShortWeekdays())) の行はデフォルト値を確認しているだけですので、なくても動作します。

投稿2018/01/05 00:39

mit0223

総合スコア3401

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問