Javaの内部化-クイックガイド

内面化

内部化またはI18Nは、複数の異なる言語でユーザーにサービスを提供できるアプリケーションの機能を指します。Javaには、内部化のサポートが組み込まれています。Javaは、数値、通貨のフォーマット、およびそれに応じた日付と時刻の調整も提供します。

Javaの国際化は、Javaアプリケーションがさまざまな言語、数値形式、通貨、地域固有の時間形式を処理できるようにするのに役立ちます。

ローカリゼーション

ローカリゼーションまたはL10Nは、アプリケーションの適応性であり、アプリケーションが特定の言語、数値形式、日付と時刻の設定などに適応する方法です。

Javaアプリケーションは、それ自体をローカライズできるようにするために国際化する必要があります。

文化に依存する情報

以下の情報項目は、多くの場合、タイムゾーンや文化によって異なります。

  • Messages

  • Date

  • Time

  • Number

  • Currency

  • Measurements

  • 電話番号

  • 住所

  • GUIラベル

国際化クラス

Javaには、アプリケーションの国際化に役立つ一連の組み込みクラスがあります。これらのクラスは次のとおりです。

シニア番号クラスと説明
1

Locale

国/地域とともに言語を表します。

2

ResourceBundle

ローカライズされたテキストまたはオブジェクトが含まれます。

3

NumberFormat

ロケールに従って数値/通貨をフォーマットするために使用します。

4

DecimalFormat

カスタマイズされたフォーマットおよびロケールに従って数値をフォーマットするために使用します。

5

DateFormat

ロケールごとに日付をフォーマットするために使用します。

6

SimpleDateFormat

カスタマイズされた形式およびロケールに従って日付をフォーマットするために使用します。

Javaの内部化-環境のセットアップ

この章では、Javaに適した環境をセットアップするさまざまな側面について説明します。

ローカル環境のセットアップ

それでもJavaプログラミング言語用の環境をセットアップする場合は、このセクションで、マシンにJavaをダウンロードしてセットアップする方法について説明します。以下は、環境をセットアップするための手順です。

Java SEは、Javaのダウンロードリンクから無料で入手できます。オペレーティングシステムに基づいたバージョンをダウンロードできます。

指示に従ってJavaをダウンロードし、 .exeマシンにJavaをインストールします。マシンにJavaをインストールしたら、正しいインストールディレクトリを指すように環境変数を設定する必要があります-

Windowsのパスを設定する

Javaをc:\ Program Files \ java \ jdkディレクトリにインストールしたと仮定します-

  • 「マイコンピュータ」を右クリックし、「プロパティ」を選択します。

  • [詳細設定]タブの下にある[環境変数]ボタンをクリックします。

  • ここで、「Path」変数を変更して、Java実行可能ファイルへのパスも含まれるようにします。たとえば、パスが現在「C:\ WINDOWS \ SYSTEM32」に設定されている場合は、パスを「C:\ WINDOWS \ SYSTEM32; c:\ ProgramFiles \ java \ jdk \ bin」に変更します。

Linux、UNIX、Solaris、FreeBSDのパスの設定

環境変数PATHは、Javaバイナリがインストールされている場所を指すように設定する必要があります。これを行うのに問題がある場合は、シェルのドキュメントを参照してください。

たとえば、シェルとしてbashを使用する場合は、 '。bashrcの末尾に次の行を追加します。exportPATH= / path / to / java:$ PATH'

人気のあるJavaエディター

Javaプログラムを作成するには、テキストエディタが必要です。市場にはさらに洗練されたIDEがあります。しかし今のところ、あなたは次のいずれかを考えることができます-

  • Notepad − Windowsマシンでは、メモ帳(このチュートリアルに推奨)、TextPadなどの単純なテキストエディターを使用できます。

  • Netbeans −オープンソースで無料のJava IDEで、からダウンロードできます。 https://www.netbeans.org/index.html。

  • Eclipse −Eclipseオープンソースコミュニティによって開発されたJavaIDEで、以下からダウンロードできます。 https://www.eclipse.org/。

次は何ですか?

次の章では、最初のJavaプログラムを作成して実行する方法と、アプリケーションの開発に必要なJavaの重要な基本構文のいくつかについて説明します。

Javaの内部化-ロケールクラス

ロケールオブジェクトは、特定の地理的/政治的/文化的地域を表します。タスクを実行するためにロケールを必要とする操作は、ロケール依存操作と呼ばれ、ロケールを使用してユーザーに関連する情報をマスターします。たとえば、数値の表示はロケールに依存する操作です。番号は、ユーザーの母国、地域、または文化の慣習や慣習に従ってフォーマットする必要があります。

ロケールの内容

ロケールオブジェクトには次のものが含まれます。

  • Language-ISO 639 alpha-2またはalpha-3言語コード、または最大8文字のアルファ文字の登録済み言語サブタグ。alpha-2コードとalpha-3コードの両方が存在する場合は、alpha-2コードを使用する必要があります。言語フィールドでは大文字と小文字は区別されませんが、ロケールでは常に小文字に正規化されます。

  • Script-ISO 15924alpha-4スクリプトコード。スクリプトフィールドでは大文字と小文字は区別されませんが、ロケールでは常に大文字と小文字が区別されます。

  • Country (region)-ISO 3166alpha-2国コードまたはUNM.49数値-3市外局番。国フィールドでは大文字と小文字は区別されませんが、ロケールでは常に大文字に正規化されます。

  • Variant-ロケールのバリエーションを示すために使用される任意の値。それぞれが独自のセマンティクスを示す2つ以上のバリアント値がある場合、これらの値は重要度の順に並べる必要があり、最も重要なものが最初にアンダースコア( '_')で区切られます。バリアントフィールドでは大文字と小文字が区別されます。

  • Extensions-単一文字キーから文字列値へのマップ。言語の識別以外の拡張機能を示します。ロケールの拡張機能は、BCP47拡張機能サブタグと私的使用サブタグのセマンティクスと構文を実装します。拡張子は大文字と小文字を区別しませんが、ロケールはすべての拡張子キーと値を小文字に正規化します。

Javaの内部化-例-ロケールの詳細

この例では、デフォルトのロケールを取得してその詳細を出力します。次に、「fr」のロケールを作成し、その詳細を出力します。

I18NTester.java

import java.util.Locale;

public class I18NTester {
   public static void main(String[] args) {
      Locale locale =Locale.getDefault();  

      System.out.println("Default Locale Properties:\n");

      System.out.println(locale.getDisplayCountry());  
      System.out.println(locale.getDisplayLanguage());  
      System.out.println(locale.getDisplayName());  
      System.out.println(locale.getISO3Country());  
      System.out.println(locale.getISO3Language());  
      System.out.println(locale.getLanguage());  
      System.out.println(locale.getCountry());  

      Locale frenchLocale = new Locale("fr","fr");

      System.out.println("\nfr Locale Properties:\n");
      System.out.println(frenchLocale.getDisplayCountry());  
      System.out.println(frenchLocale.getDisplayLanguage());  
      System.out.println(frenchLocale.getDisplayName());  
      System.out.println(frenchLocale.getISO3Country());  
      System.out.println(frenchLocale.getISO3Language());  
      System.out.println(frenchLocale.getLanguage());  
      System.out.println(frenchLocale.getCountry());  
   }
}

出力

次の結果が出力されます。

Default Locale Properties:

United States
English
English (United States)
USA
eng
en
US

fr Locale Properties:

France
French
French (France)
FRA
fra
fr
FR

Javaの内部化-例-表示言語

この例では、引数として渡されたロケールごとの表示言語を取得します。

I18NTester.java

import java.util.Locale;

public class I18NTester {
   public static void main(String[] args) {
      Locale defaultLocale = Locale.getDefault();
      Locale enLocale = new Locale("en", "US");  
      Locale frLocale = new Locale("fr", "FR");  
      Locale esLocale = new Locale("es", "ES");

      System.out.println(defaultLocale.getDisplayLanguage(enLocale));
      System.out.println(defaultLocale.getDisplayLanguage(frLocale));
      System.out.println(defaultLocale.getDisplayLanguage(esLocale));
   }
}

出力

次の結果が出力されます。

English
anglais
inglés

Javaの内部化-ResourceBundleクラス

ResourceBundleクラスは、ロケールに依存するテキストとオブジェクトを格納するために使用されます。通常、プロパティファイルを使用してロケール固有のテキストを保存し、ResourceBundleオブジェクトを使用してそれらを表します。以下は、Javaベースのアプリケーションでロケール固有のプロパティファイルを使用する手順です。

ステップ1:プロパティファイルを作成します。

英語ロケールのプロパティファイルが必要だとします。次に、プロパティファイル名XXX_en_US.propertiesを作成します。ここで、XXXはファイルの名前であり、en_USは英語(US)のロケールを表します。

Messages_en_US.properties

message=Welcome to TutorialsPoint.COM!

次に、フランス語ロケールのプロパティファイルを作成しましょう。次に、プロパティファイル名XXX_fr_FR.propertiesを作成します。ここで、XXXはファイルの名前であり、fr_FRはフランス語(フランス)のロケールを表します。

Messages_fr_FR.properties

message=Bienvenue sur TutorialsPoint.COM!

ここで、キーは同じですが、値は両方のプロパティファイルでロケール固有であることがわかります。

ステップ2:ResourceBundleオブジェクトを作成する

次の構文を使用して、プロパティファイル名とロケールでResourceBundleオブジェクトを作成します。

ResourceBundle bundle = ResourceBundle.getBundle("Messages", Locale.US);

手順3:ResourceBundleオブジェクトから値を取得します。

キーを渡して、ResourceBundleオブジェクトから値を取得します。

String value = bundle.getString("message");

次の例は、ResourceBundleオブジェクトを使用して、プロパティファイルからロケール固有の値を表示する方法を示しています。

IOTester.java

import java.util.Locale;
import java.util.ResourceBundle;

public class I18NTester {
   public static void main(String[] args) {
      ResourceBundle bundle = ResourceBundle.getBundle("Messages", Locale.US);  
      System.out.println("Message in "+Locale.US +": "+bundle.getString("message"));  

      bundle = ResourceBundle.getBundle("Messages", Locale.FRANCE);  
      System.out.println("Message in "+Locale.FRANCE +": "+bundle.getString("message"));
   }
}

出力

次の結果が出力されます。

Message in en_US: Welcome to TutorialsPoint.COM!
Message in fr_FR: Bienvenue sur TutorialsPoint.COM!

命名規則に関する注記

プロパティファイルの命名規則は次のとおりです。

  • デフォルトのロケールにマップされたプロパティファイルの場合、プレフィックスは必須ではありません。message_en_US.propertiesはmessage.propertiesと同等です。

  • ロケールにマップされたプロパティファイルの場合、プレフィックスは2つの方法で添付できます。message_fr.propertiesは、message_fr_FR.propertiesと同等です。

Javaの内部化-NumberFormatクラス

java.text.NumberFormatクラスは、特定のロケールに従って数値と通貨をフォーマットするために使用されます。番号の形式は国によって異なります。たとえば、デンマークでは、数値の分数はコンマを使用して整数部分から分離されますが、英国では、区切り文字としてドットを使用します。

例-フォーマット番号

この例では、米国のロケールとデンマークのロケールに基づいて数値をフォーマットしています。

IOTester.java

import java.text.NumberFormat;
import java.util.Locale;

public class I18NTester {
   public static void main(String[] args) {
      Locale enLocale = new Locale("en", "US");  
      Locale daLocale = new Locale("da", "DK");

      NumberFormat numberFormat = NumberFormat.getInstance(daLocale);

      System.out.println(numberFormat.format(100.76));

      numberFormat = NumberFormat.getInstance(enLocale);

      System.out.println(numberFormat.format(100.76));
   }
}

出力

次の結果が出力されます。

100,76
100.76

Javaの内部化-フォーマット通貨

この例では、米国のロケールとデンマークのロケールに基づいて通貨をフォーマットしています。

IOTester.java

import java.text.NumberFormat;
import java.util.Locale;

public class I18NTester {
   public static void main(String[] args) {
      Locale enLocale = new Locale("en", "US");  
      Locale daLocale = new Locale("da", "DK");

      NumberFormat numberFormat = NumberFormat.getCurrencyInstance(daLocale);

      System.out.println(numberFormat.format(100.76));

      numberFormat = NumberFormat.getCurrencyInstance(enLocale);

      System.out.println(numberFormat.format(100.76));
   }
}

出力

次の結果が出力されます。

kr 100,76
$100.76

Javaの内部化-フォーマットのパーセンテージ

この例では、数値をパーセンテージ形式でフォーマットしています。

IOTester.java

import java.text.NumberFormat;
import java.util.Locale;

public class I18NTester {
   public static void main(String[] args) {
      Locale enLocale = new Locale("en", "US");        

      NumberFormat numberFormat = NumberFormat.getPercentInstance(enLocale);

      System.out.println(numberFormat.format(0.76));    
   }
}

出力

次の結果が出力されます。

76%

Javaの内部化-最小/最大精度の設定

この例では、整数と数値の小数部分の両方に最小桁と最大桁を設定しています。

IOTester.java

import java.text.NumberFormat;
import java.util.Locale;

public class I18NTester {
   public static void main(String[] args) {
      Locale enLocale = new Locale("en", "US");  

      NumberFormat numberFormat = NumberFormat.getInstance(enLocale);
      numberFormat.setMinimumIntegerDigits(2);
      numberFormat.setMaximumIntegerDigits(3);

      numberFormat.setMinimumFractionDigits(2);
      numberFormat.setMaximumFractionDigits(3);

      System.out.println(numberFormat.format(12234.763443));
   }
}

出力

次の結果が出力されます。

234.763

Javaの内部化-丸めモードを設定する

この例では、丸めモードを紹介しています。

IOTester.java

import java.math.RoundingMode;
import java.text.NumberFormat;
import java.util.Locale;

public class I18NTester {
   public static void main(String[] args) {
      Locale enLocale = new Locale("en", "US");  
 
      NumberFormat numberFormat = NumberFormat.getInstance(enLocale);

      numberFormat.setMinimumFractionDigits(0);
      numberFormat.setMaximumFractionDigits(0);

      System.out.println(numberFormat.format(99.50));

      numberFormat.setRoundingMode(RoundingMode.HALF_DOWN);

      System.out.println(numberFormat.format(99.50));
   }
}

出力

次の結果が出力されます。

100
99

Javaの内部化-数値の解析

この例では、さまざまなロケールに存在する数値の解析を示しています。

IOTester.java

import java.text.NumberFormat;
import java.text.ParseException;
import java.util.Locale;

public class I18NTester {
   public static void main(String[] args) throws ParseException {
      Locale enLocale = new Locale("en", "US");  
      Locale daLocale = new Locale("da", "DK");

      NumberFormat numberFormat = NumberFormat.getInstance(daLocale);

      System.out.println(numberFormat.parse("100,76"));

      numberFormat = NumberFormat.getInstance(enLocale);

      System.out.println(numberFormat.parse("100,76"));
   }
}

出力

次の結果が出力されます。

100.76
10076

Javaの内部化-DecimalFormatクラス

java.text.DecimalFormatクラスは、カスタマイズされた形式およびロケールに従って数値をフォーマットするために使用されます。

例-フォーマット番号

この例では、特定のパターンに基づいて数値をフォーマットしています。

IOTester.java

import java.text.DecimalFormat;

public class I18NTester {
   public static void main(String[] args) {
      String pattern = "####,####.##";
      double number = 123456789.123;
      
      DecimalFormat numberFormat = new DecimalFormat(pattern);

      System.out.println(number);
      
      System.out.println(numberFormat.format(number));
   }
}

出力

次の結果が出力されます。

1.23456789123E8
1,2345,6789.12

Javaの内部化-フォーマットパターン

以下は、フォーマットパターンでの文字の使用です。

シニア番号クラスと説明
1

0

存在する桁が少ない場合に0を表示します。

2

#

先行ゼロを省略した数字を表示します。

3

.

小数点記号。

4

,

グループ化セパレータ。

5

E

指数形式の仮数および指数セパレータ。

6

;

フォーマットセパレータ。

7

-

負の数のプレフィックス。

8

%

100を掛けた後の数値をパーセンテージで表示します。

9

?

1000を掛けた後の数をミルとして表示します。

10

X

文字を番号の接頭辞/接尾辞としてマークします。

11

'

特殊文字を引用符で囲みます。

この例では、さまざまなパターンに基づいて数値をフォーマットしています。

IOTester.java

import java.text.DecimalFormat;

public class I18NTester {
   public static void main(String[] args) {
      String pattern = "###.###";
      double number = 123456789.123;

      DecimalFormat numberFormat = new DecimalFormat(pattern);

      System.out.println(number);

      //pattern ###.###
      System.out.println(numberFormat.format(number));

      //pattern ###.#
      numberFormat.applyPattern("###.#");
      System.out.println(numberFormat.format(number));

      //pattern ###,###.##
      numberFormat.applyPattern("###,###.##");
      System.out.println(numberFormat.format(number));

      number = 9.34;

      //pattern 000.###
      numberFormat.applyPattern("000.##");
      System.out.println(numberFormat.format(number));           
   }
}

出力

次の結果が出力されます。

1.23456789123E8
1,2345,6789.12

Javaの内部化-ロケール固有のDecimalFormat

デフォルトでは、DecimalFormatオブジェクトはJVMのロケールを使用しています。NumberFormatクラスを使用してDecimalFormatオブジェクトを作成するときに、デフォルトのロケールを変更できます。以下の例では、2つの異なるロケールに同じパターンを使用し、出力の違いを見つけることができます。

IOTester.java

import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.Locale;

public class I18NTester {
   public static void main(String[] args) {
      String pattern = "###.##";
      double number = 123.45;

      Locale enlocale  = new Locale("en", "US");
      Locale dalocale  = new Locale("da", "DK");

      DecimalFormat decimalFormat = (DecimalFormat) NumberFormat.getNumberInstance(enlocale);
      decimalFormat.applyPattern(pattern);

      System.out.println(decimalFormat.format(number));
   

      decimalFormat = (DecimalFormat) NumberFormat.getNumberInstance(dalocale);
      decimalFormat.applyPattern(pattern);

      System.out.println(decimalFormat.format(number));     
   }
}

出力

次の結果が出力されます。

123.45
123,45

Javaの内部化-DecimalFormatSymbolsクラス

DecimalFormatSymbolsクラスを使用して、デフォルトの区切り記号、グループ化区切り記号などを変更できます。次の例は同じことを示しています。

IOTester.java

import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;

public class I18NTester {
   public static void main(String[] args) {
      String pattern = "#,###.###";
      double number = 126473.4567;

      DecimalFormat decimalFormat = new DecimalFormat(pattern);

      System.out.println(decimalFormat.format(number));
   

      DecimalFormatSymbols decimalFormatSymbols = new DecimalFormatSymbols();
      decimalFormatSymbols.setDecimalSeparator(';');
      decimalFormatSymbols.setGroupingSeparator(':');

      decimalFormat = new DecimalFormat(pattern, decimalFormatSymbols);

      System.out.println(decimalFormat.format(number));
   }
}

出力

次の結果が出力されます。

126,473.457
126:473;457

Javaの内部化-数字のグループ化

DecimalFormatのsetGroupingSize()メソッドを使用して、数値のデフォルトのグループ化を変更できます。次の例は同じことを示しています。

IOTester.java

import java.text.DecimalFormat;

public class I18NTester {
   public static void main(String[] args) {
      double number = 121223232473.4567;

      DecimalFormat decimalFormat = new DecimalFormat();

      System.out.println(number);
      System.out.println(decimalFormat.format(number));
   

      decimalFormat.setGroupingSize(4);
      System.out.println(decimalFormat.format(number));
   
   }
}

出力

次の結果が出力されます。

1.212232324734567E11
121,223,232,473.457
1212,2323,2473.457

Javaの内部化-DateFormatクラス

java.text.DateFormatクラスは、ロケールに従って日付をフォーマットします。国が異なれば、日付の表示にさまざまな形式が使用されます。このクラスは、アプリケーションの内部化で日付を処理するのに非常に役立ちます。次の例は、DateFormatクラスを作成して使用する方法を示しています。

IOTester.java

import java.text.DateFormat;
import java.util.Date;
import java.util.Locale;

public class I18NTester {
   public static void main(String[] args) {
      Locale locale = new Locale("da","DK");

      DateFormat dateFormat = DateFormat.getDateInstance();

      System.out.println(dateFormat.format(new Date()));

      dateFormat = DateFormat.getDateInstance(DateFormat.DEFAULT, locale);

      System.out.println(dateFormat.format(new Date()));
   }
}

出力

次の結果が出力されます。

Nov 29, 2017
29-11-2017

Javaの内部化-日付のフォーマット

DateFormatクラスは、日付をフォーマットするためのさまざまなフォーマットを提供します。以下はいくつかのフォーマットのリストです。

  • DateFormat.DEFAULT

  • DateFormat.SHORT

  • DateFormat.MEDIUM

  • DateFormat.LONG

  • DateFormat.FULL

次の例では、さまざまな形式の使用方法を示します。

IOTester.java

import java.text.DateFormat;
import java.util.Date;

public class I18NTester {
   public static void main(String[] args) {
   
      DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.DEFAULT);

      System.out.println(dateFormat.format(new Date()));

      dateFormat = DateFormat.getDateInstance(DateFormat.SHORT);

      System.out.println(dateFormat.format(new Date()));

      dateFormat = DateFormat.getDateInstance(DateFormat.MEDIUM);

      System.out.println(dateFormat.format(new Date()));

      dateFormat = DateFormat.getDateInstance(DateFormat.LONG);

      System.out.println(dateFormat.format(new Date()));

      dateFormat = DateFormat.getDateInstance(DateFormat.FULL);

      System.out.println(dateFormat.format(new Date()));
  
  
   }
}

出力

次の結果が出力されます。

Nov 29, 2017
11/29/17
Nov 29, 2017
November 29, 2017
Wednesday, November 29, 2017

Javaの内部化-フォーマット時間

DateFormatクラスは、時間をフォーマットするためのさまざまなフォーマットを提供します。DateFormat.getTimeInstance()メソッドが使用されます。以下の例を参照してください。

次の例では、さまざまな形式を使用して時間をフォーマットする方法を示します。

IOTester.java

import java.text.DateFormat;
import java.util.Date;

public class I18NTester {
   public static void main(String[] args) {
   
      DateFormat dateFormat = DateFormat.getTimeInstance(DateFormat.DEFAULT);

      System.out.println(dateFormat.format(new Date()));

      dateFormat = DateFormat.getTimeInstance(DateFormat.SHORT);

      System.out.println(dateFormat.format(new Date()));

      dateFormat = DateFormat.getTimeInstance(DateFormat.MEDIUM);

      System.out.println(dateFormat.format(new Date()));

      dateFormat = DateFormat.getTimeInstance(DateFormat.LONG);

      System.out.println(dateFormat.format(new Date()));

      dateFormat = DateFormat.getTimeInstance(DateFormat.FULL);

      System.out.println(dateFormat.format(new Date()));
  
  
   }
}

出力

次の結果が出力されます。

4:11:21 PM
4:11 PM
4:11:21 PM
4:11:21 PM IST
4:11:21 PM IST

Javaの内部化-日付と時刻のフォーマット

DateFormatクラスは、日付と時刻を一緒にフォーマットするためのさまざまなフォーマットを提供します。DateFormat.getDateTimeInstance()メソッドが使用されます。以下の例を参照してください。

次の例では、さまざまな形式を使用して日付と時刻をフォーマットする方法を示します。

IOTester.java

import java.text.DateFormat;
import java.util.Date;

public class I18NTester {
   public static void main(String[] args) {

      DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.DEFAULT, DateFormat.DEFAULT);

      System.out.println(dateFormat.format(new Date()));

      dateFormat = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT);

      System.out.println(dateFormat.format(new Date()));

      dateFormat = DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.MEDIUM);

      System.out.println(dateFormat.format(new Date()));

      dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG);

      System.out.println(dateFormat.format(new Date()));

      dateFormat = DateFormat.getDateTimeInstance(DateFormat.FULL, DateFormat.FULL);

      System.out.println(dateFormat.format(new Date()));
  

   }
}

出力

次の結果が出力されます。

Nov 29, 2017 4:16:13 PM
11/29/17 4:16 PM
Nov 29, 2017 4:16:13 PM
November 29, 2017 4:16:13 PM IST
Wednesday, November 29, 2017 4:16:13 PM IST

Javaの内部化-SimpleDateFormatクラス

java.text.SimpleDateFormatクラスは、指定されたパターンに従って日付をフォーマットします。また、文字列に上記の形式の日付が含まれている文字列から日付を解析するためにも使用されます。SimpleDateFormatクラスを使用する次の例を参照してください。

IOTester.java

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class I18NTester {
   public static void main(String[] args) throws ParseException {
   
      String pattern = "dd-MM-yyyy";

      SimpleDateFormat simpleDateFormat = new SimpleDateFormat(pattern);

      Date date = new Date();

      System.out.println(date);
      System.out.println(simpleDateFormat.format(date));

      String dateText = "29-11-2017";

      date = simpleDateFormat.parse(dateText);

      System.out.println(simpleDateFormat.format(date));
   }
}

出力

次の結果が出力されます。

Wed Nov 29 17:01:22 IST 2017
29-11-2017
29-11-2017

Javaの内部化-ロケール固有のSimpleDateFormat

ロケールを使用して、SimpleDateFormatクラスのパターンにロケール固有のフォーマットを作成できます。ロケール固有のSimpleDateFormatクラスを使用する次の例を参照してください。

IOTester.java

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;

public class I18NTester {
   public static void main(String[] args) throws ParseException {

      Locale locale = new Locale("da", "DK");
      String pattern = "EEEEE MMMMM yyyy";

      SimpleDateFormat simpleDateFormat = new SimpleDateFormat(pattern);

      Date date = new Date();

      System.out.println(date);
      System.out.println(simpleDateFormat.format(date));

      simpleDateFormat = new SimpleDateFormat(pattern,locale);

      System.out.println(simpleDateFormat.format(date));
   }
}

出力

次の結果が出力されます。

Wed Nov 29 17:48:14 IST 2017
Wednesday November 2017
onsdag november 2017

Javaの内部化-DecimalFormatSymbolsクラス

DecimalFormatSymbolsクラスを使用して、デフォルトの区切り記号、グループ化区切り記号などを変更できます。次の例は同じことを示しています。

IOTester.java

import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;

public class I18NTester {
   public static void main(String[] args) {
      String pattern = "#,###.###";
      double number = 126473.4567;

      DecimalFormat decimalFormat = new DecimalFormat(pattern);

      System.out.println(decimalFormat.format(number));
   

      DecimalFormatSymbols decimalFormatSymbols = new DecimalFormatSymbols();
      decimalFormatSymbols.setDecimalSeparator(';');
      decimalFormatSymbols.setGroupingSeparator(':');

      decimalFormat = new DecimalFormat(pattern, decimalFormatSymbols);

      System.out.println(decimalFormat.format(number));
   }
}

出力

次の結果が出力されます。

126,473.457
126:473;457

Javaの内部化-日付形式のパターン

以下は、日付の書式設定パターンでの文字の使用です。

シニア番号クラスと説明
1

G

時代を表示します。

2

y

年を表示します。有効な値yy、yyyy。

3

M

月を表示します。有効な値MM、MMM、またはMMMMM。

4

d

曜日を表示します。有効な値d、dd。

5

h

時刻(1-12 AM / PM)を表示します。有効な値hh。

6

H

時刻(0〜23)を表示します。有効な値HH。

7

m

時間の分(0-59)を表示します。有効な値mm。

8

s

分(0-59)の秒を表示します。有効な値ss。

9

S

ミリ秒(0-999)を表示します。有効な値SSS。

10

E

曜日を表示するには(月曜日、火曜日など)

11

D

年の日(1-366)を表示します。

12

F

月の曜日を表示します(例:12月の第1木曜日)。

13

w

年の週(1-53)を表示します。

14

W

月の週(0-5)を表示するには

15

a

AM / PMを表示するには

16

k

日(1-24)の時間を表示します。

17

K

時刻を表示するには、AM / PM(0-11)。

18

z

タイムゾーンを表示します。

この例では、さまざまなパターンに基づいて日付をフォーマットしています。

IOTester.java

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class I18NTester {
   public static void main(String[] args) throws ParseException {

      String pattern = "dd-MM-yy";
      SimpleDateFormat simpleDateFormat = new SimpleDateFormat(pattern);
      Date date = new Date();
      System.out.println(simpleDateFormat.format(date));

      pattern = "MM-dd-yyyy";
      simpleDateFormat = new SimpleDateFormat(pattern);
      System.out.println(simpleDateFormat.format(date));

      pattern = "yyyy-MM-dd HH:mm:ss";
      simpleDateFormat = new SimpleDateFormat(pattern);
      System.out.println(simpleDateFormat.format(date));

      pattern = "EEEEE MMMMM yyyy HH:mm:ss.SSSZ";
      simpleDateFormat = new SimpleDateFormat(pattern);
      System.out.println(simpleDateFormat.format(date));
}
}

出力

次の結果が出力されます。

29-11-17
11-29-2017
2017-11-29 18:47:42
Wednesday November 2017 18:47:42.787+0530

Javaの内部化-UTC

UTCは、協定世界時の略です。これは時間標準であり、世界中で一般的に使用されています。すべてのタイムゾーンは、UTCをオフセットとして比較的計算されます。たとえば、デンマークのコペンハーゲンでの時間はUTC + 1であり、UTC時間に1時間を加えたものを意味します。これは夏時間とは無関係であり、データベースに日付と時刻を保存するために使用する必要があります。

タイムゾーンの変換

次の例では、さまざまなタイムゾーンの変換を紹介します。時刻と時刻をミリ秒単位で出力します。最初は変化し、2番目は同じままです。

IOTester.java

import java.text.ParseException;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.TimeZone;

public class I18NTester {
   public static void main(String[] args) throws ParseException {
   
      Calendar date = new GregorianCalendar();

      date.setTimeZone(TimeZone.getTimeZone("Etc/UTC"));
      date.set(Calendar.HOUR_OF_DAY, 12);

      System.out.println("UTC: " + date.get(Calendar.HOUR_OF_DAY));
      System.out.println("UTC: " + date.getTimeInMillis());

      date.setTimeZone(TimeZone.getTimeZone("Europe/Copenhagen"));
      System.out.println("CPH: " + date.get(Calendar.HOUR_OF_DAY));
      System.out.println("CPH: " + date.getTimeInMillis());

      date.setTimeZone(TimeZone.getTimeZone("America/New_York"));
      System.out.println("NYC: " + date.get(Calendar.HOUR_OF_DAY));
      System.out.println("NYC: " + date.getTimeInMillis());
   }
}

出力

次の結果が出力されます。

UTC: 12
UTC: 1511956997540
CPH: 13
CPH: 1511956997540
NYC: 7
NYC: 1511956997540

利用可能なタイムゾーン

次の例では、システムで使用可能なタイムゾーンを示します。

IOTester.java

import java.text.ParseException;
import java.util.TimeZone;

public class I18NTester {
   public static void main(String[] args) throws ParseException {
      String[] availableIDs = TimeZone.getAvailableIDs();

      for(String id : availableIDs) {
         System.out.println("Timezone = " + id);
      }
   }
}

出力

次の結果が出力されます。

Timezone = Africa/Abidjan
Timezone = Africa/Accra
...
Timezone = VST

Javaの内部化-文字列との間のUnicode変換

Javaでは、テキストは内部でUnicode形式で保存されます。入出力の形式が異なる場合は、変換が必要です。

変換

次の例では、Unicode文字列からUTF8バイト[]への変換とUTF8バイト[]からUnicodeバイト[]への変換を紹介します。

IOTester.java

import java.io.UnsupportedEncodingException;
import java.nio.charset.Charset;
import java.text.ParseException;

public class I18NTester {
   public static void main(String[] args) throws ParseException, UnsupportedEncodingException {

      String unicodeString = "\u00C6\u00D8\u00C5" ;

      //convert Unicode to UTF8 format
      byte[] utf8Bytes = unicodeString.getBytes(Charset.forName("UTF-8"));
      printBytes(utf8Bytes, "UTF 8 Bytes");

      //convert UTF8 format to Unicode
      String converted = new String(utf8Bytes, "UTF8");
      byte[] unicodeBytes = converted.getBytes();
      printBytes(unicodeBytes, "Unicode Bytes");
   }

   public static void printBytes(byte[] array, String name) {
      for (int k = 0; k < array.length; k++) {
         System.out.println(name + "[" + k + "] = " + array[k]);
          
      }
   }
}

出力

次の結果が出力されます。

UTF 8 Bytes[0] = -61
UTF 8 Bytes[1] = -122
UTF 8 Bytes[2] = -61
UTF 8 Bytes[3] = -104
UTF 8 Bytes[4] = -61
UTF 8 Bytes[5] = -123
Unicode Bytes[0] = -58
Unicode Bytes[1] = -40
Unicode Bytes[2] = -59

Javaの内部化-リーダー/ライターとの間のUnicode変換

ReaderクラスとWriterクラスは、文字指向のストリームクラスです。これらは、Unicode文字の読み取りと変換に使用できます。

変換

次の例では、ReaderクラスとWriterクラスを使用して、Unicode文字列をUTF8バイト[]に、UTF8バイト[]をUnicodeバイト[]に変換する方法を紹介します。

IOTester.java

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.Reader;
import java.io.Writer;
import java.nio.charset.Charset;
import java.text.ParseException;

public class I18NTester {
   public static void main(String[] args) throws ParseException, IOException {

      String input = "This is a sample text" ;

      InputStream inputStream = new ByteArrayInputStream(input.getBytes());

      //get the UTF-8 data
      Reader reader = new InputStreamReader(inputStream, Charset.forName("UTF-8"));

      //convert UTF-8 to Unicode
      int data = reader.read();
      while(data != -1){
         char theChar = (char) data;
         System.out.print(theChar);
         data = reader.read();
      }
      reader.close();

      System.out.println();

      //Convert Unicode to UTF-8 Bytes
      ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
      Writer writer = new OutputStreamWriter(outputStream, Charset.forName("UTF-8"));

      writer.write(input);
      writer.close();

      String out = new String(outputStream.toByteArray());
   
      System.out.println(out);
   }  
}

出力

次の結果が出力されます。

This is a sample text
This is a sample text
印刷