SimpleDateFormat およびロケールベースのフォーマット文字列
-
12-09-2019 - |
質問
指定されたロケールに基づいて、Java で日付をさまざまな方法でフォーマットしようとしています。たとえば、英語のユーザーには「2009 年 11 月 1 日」(「MMM d, yyyy」の形式) を表示し、ノルウェー語のユーザーには「1.11月2009」(「d.うーん。yyyy")。
SimpleDateFormat コンストラクターにロケールを追加すると月の部分は正常に動作しますが、残りはどうなるでしょうか?
ロケールとペアになった書式文字列を SimpleDateFormat に追加できることを期待していましたが、これを行う方法が見つかりません。コードでロケールをチェックし、対応するフォーマット文字列を追加することは可能ですか、それとも必要ですか?
解決
使用<のhref = "https://docs.oracle.com/javase/7/docs/api/java/text/DateFormat.html#getDateInstance(int,%20java.util.Locale)" のrel =」 noreferrer "> DateFormat.getDateInstance(int型のスタイル、ロケールロケール)の代わりにSimpleDateFormat
を使用して独自のパターンを作成する。
他のヒント
SimpleDateFormat dateFormat = new SimpleDateFormat("EEEE dd MMM yyyy", Locale.ENGLISH);
String formatted = dateFormat.format(the_date_you_want_here);
ののスタイル+ロケールを使用します。のDateFormat.getDateInstance(int型のスタイル、ロケールロケール)の
//java.sun:のhttpをチェック.COM / J2SE / 1.5.0 /ドキュメント/ API / Javaの/テキスト/ DateFormat.html の
の違いを確認するために、次の例を実行します:
import java.text.DateFormat;
import java.util.Date;
import java.util.Locale;
public class DateFormatDemoSO {
public static void main(String args[]) {
int style = DateFormat.MEDIUM;
//Also try with style = DateFormat.FULL and DateFormat.SHORT
Date date = new Date();
DateFormat df;
df = DateFormat.getDateInstance(style, Locale.UK);
System.out.println("United Kingdom: " + df.format(date));
df = DateFormat.getDateInstance(style, Locale.US);
System.out.println("USA: " + df.format(date));
df = DateFormat.getDateInstance(style, Locale.FRANCE);
System.out.println("France: " + df.format(date));
df = DateFormat.getDateInstance(style, Locale.ITALY);
System.out.println("Italy: " + df.format(date));
df = DateFormat.getDateInstance(style, Locale.JAPAN);
System.out.println("Japan: " + df.format(date));
}
}
出力:
United Kingdom: 25-Sep-2017
USA: Sep 25, 2017
France: 25 sept. 2017
Italy: 25-set-2017
Japan: 2017/09/25
先生
LocalDate.now().format(
DateTimeFormatter.ofLocalizedDate( FormatStyle.MEDIUM )
.withLocale( new Locale( "no" , "NO" ) )
)
面倒な授業は、 java.util.Date
そして SimpleDateFormat
現在はレガシーであり、java.time クラスに取って代わられています。
LocalDate
の LocalDate
class は、時刻やタイムゾーンを含まない日付のみの値を表します。
タイムゾーンは日付を決定する際に重要です。特定の瞬間において、日付は世界中でゾーンごとに異なります。たとえば、午前0時過ぎの数分後、 フランス・パリ 「昨日」のままでありながら、新しい日です。 モントリオール ケベック州.
ZoneId z = ZoneId.of( "America/Montreal" );
LocalDate today = LocalDate.now( z );
DateTimeFormatter
使用 DateTimeFormatter
日付部分または時間部分のみを表す文字列を生成します。
の DateTimeFormatter
クラスは自動的に ローカライズする.
ローカライズするには、次のように指定します。
FormatStyle
文字列の長さまたは短縮を決定します。Locale
(a) 日の名前、月の名前などの翻訳に使用される人間の言語、および (b) 略語、大文字の使用、句読点などの問題を決定する文化的規範を決定すること。
例:
Locale l = Locale.CANADA_FRENCH ;
DateTimeFormatter f = DateTimeFormatter.ofLocalizedDate( FormatStyle.FULL ).withLocale( l );
String output = ld.format( f );
逆の方向に進むと、ローカライズされた文字列を解析できます。
LocalDate ld = LocalDate.parse( input , f );
ロケールとタイムゾーンは完全に独立した問題であることに注意してください。モントリオールの瞬間を日本語で紹介したり、ニュージーランドのオークランドの瞬間をヒンディー語で紹介したりできます。
もう一つの例:変化 6 junio 2012
(スペイン語)へ 2012-06-06
(標準 ISO8601 フォーマット)。java.time クラスは、文字列の解析/生成にデフォルトで ISO 8601 形式を使用します。
String input = "6 junio 2012";
Locale l = new Locale ( "es" , "ES" );
DateTimeFormatter f = DateTimeFormatter.ofPattern ( "d MMMM uuuu" , l );
LocalDate ld = LocalDate.parse ( input , f );
String output = ld.toString(); // 2012-06-06.
フォーマットを熟読する
以下は、自動的にローカライズされ、複数のロケールで複数の形式の結果を精査するためのコード例です。
アン EnumSet
の実装です Set
, 、収集時のメモリ使用量の削減と高速な実行速度の両方のために高度に最適化されています。 Enum
オブジェクト。それで、 EnumSet.allOf( FormatStyle.class )
の 4 つすべてのコレクションが得られます。 FormatStyle
ループする列挙オブジェクト。詳細については、を参照してください。 列挙型に関する Oracle チュートリアル.
LocalDate ld = LocalDate.of( 2018 , Month.JANUARY , 23 );
List < Locale > locales = new ArrayList <>( 3 );
locales.add( Locale.CANADA_FRENCH );
locales.add( new Locale( "no" , "NO" ) );
locales.add( Locale.US );
// Or use all locales (almost 800 of them, for about 120K text results).
// Locale[] locales = Locale.getAvailableLocales(); // All known locales. Almost 800 of them.
for ( Locale locale : locales )
{
System.out.println( "------| LOCALE: " + locale + " — " + locale.getDisplayName() + " |----------------------------------" + System.lineSeparator() );
for ( FormatStyle style : EnumSet.allOf( FormatStyle.class ) )
{
DateTimeFormatter f = DateTimeFormatter.ofLocalizedDate( style ).withLocale( locale );
String output = ld.format( f );
System.out.println( output );
}
System.out.println( "" );
}
System.out.println( "« fin »" + System.lineSeparator() );
出力。
------| LOCALE: fr_CA — French (Canada) |----------------------------------
mardi 23 janvier 2018
23 janvier 2018
23 janv. 2018
18-01-23
------| LOCALE: no_NO — Norwegian (Norway) |----------------------------------
tirsdag 23. januar 2018
23. januar 2018
23. jan. 2018
23.01.2018
------| LOCALE: en_US — English (United States) |----------------------------------
Tuesday, January 23, 2018
January 23, 2018
Jan 23, 2018
1/23/18
« fin »
について java.time
の java.time フレームワークは Java 8 以降に組み込まれています。これらのクラスは、面倒な古いクラスに取って代わります。 遺産 日時クラスなど java.util.Date
, Calendar
, & SimpleDateFormat
.
の ジョーダタイム プロジェクト、現在進行中 メンテナンスモード, への移行をアドバイスします。 java.time クラス。
詳細については、を参照してください。 オラクルのチュートリアル. 。また、Stack Overflow で検索すると、多くの例や説明が得られます。仕様は JSR 310.
交換していただけます java.time オブジェクトをデータベースに直接接続します。使う JDBCドライバー に準拠 JDBC 4.2 またはそれ以降。文字列も必要もありません java.sql.*
クラス。
java.time クラスはどこで入手できますか?
- Java SE8, Java SE9, 、 以降
- 内蔵。
- 実装がバンドルされている標準 Java API の一部。
- Java 9 では、いくつかのマイナーな機能と修正が追加されています。
- Java SE6 そして Java SE 7
- java.time 機能の多くは、Java 6 および 7 にバックポートされています。 ThreeTen バックポート.
- アンドロイド
- Android の新しいバージョンには、java.time クラスの実装がバンドルされています。
- 以前の Android の場合、 スリーテンABP プロジェクトが適応する ThreeTen バックポート (上記の通り)。見る ThreeTenABPの使い方….
の ThreeTen-Extra プロジェクトは追加のクラスで java.time を拡張します。このプロジェクトは、将来 java.time に追加される可能性があるための実験場です。ここで次のような便利なクラスを見つけることができます。 Interval
, YearWeek
, YearQuarter
, 、 そして もっと.
日付文字列のローカライズます:
redsonicのポストに基づきます:
private String localizeDate(String inputdate, Locale locale) {
Date date = new Date();
SimpleDateFormat dateFormatCN = new SimpleDateFormat("dd-MMM-yyyy", locale);
SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MMM-yyyy");
try {
date = dateFormat.parse(inputdate);
} catch (ParseException e) {
log.warn("Input date was not correct. Can not localize it.");
return inputdate;
}
return dateFormatCN.format(date);
}
String localizedDate = localizeDate("05-Sep-2013", new Locale("zh","CN"));
のようになります05-九月-2013
これは、ユーザーのの現在のロケールに従って日付を表示しますの
日付と時刻を戻すには:
import java.text.DateFormat;
import java.util.Date;
Date date = new Date();
DateFormat df = DateFormat.getDateTimeInstance();
String myDate = df.format(date);
1969年12月31日七時00分02秒PM
日付のみを返すには、使用します:
DateFormat.getDateInstance()
1969年12月31日
String text = new SimpleDateFormat("E, MMM d, yyyy").format(date);
を指定した日付のJava 8のスタイルの
LocalDate today = LocalDate.of(1982, Month.AUGUST, 31);
System.out.println(today.format(DateTimeFormatter.ofLocalizedDate(FormatStyle.MEDIUM).withLocale(Locale.ENGLISH)));
System.out.println(today.format(DateTimeFormatter.ofLocalizedDate(FormatStyle.MEDIUM).withLocale(Locale.FRENCH)));
System.out.println(today.format(DateTimeFormatter.ofLocalizedDate(FormatStyle.MEDIUM).withLocale(Locale.JAPANESE)));
Java8
import java.time.format.DateTimeFormatter;
myDate.format(DateTimeFormatter.ofPattern("dd-MMM-YYYY",new Locale("ar")))