- Java 國際化教程
- Java I18N - 首頁
- Java I18N - 概述
- Java I18N - 環境設定
- Locale 類示例
- Java I18N - Locale 類
- Java I18N - Locale 細節
- Java I18N - 顯示語言
- ResourceBundle 類示例
- Java I18N - ResourceBundle 類
- NumberFormat 類示例
- Java I18N - NumberFormat 類
- Java I18N - 格式化貨幣
- Java I18N - 格式化百分比
- Java I18N - 設定最小/最大精度
- Java I18N - 設定舍入模式
- Java I18N - 解析數字
- DecimalFormat 類示例
- Java I18N - DecimalFormat 類
- Java I18N - 格式化模式
- Java I18N - 特定區域的 DecimalFormat
- Java I18N - DecimalFormatSymbols 類
- Java I18N - 分組數字
- DateFormat 類示例
- Java Java - DateFormat 類
- Java I18N - 格式化日期
- Java I18N - 格式化時間
- Java I18N - 格式化日期和時間
- SimpleDateFormat 類示例
- Java I18N - SimpleDateFormat 類
- Java I18N - 格式化日期
- Java I18N - DateFormatSymbols 類
- Java I18N - 日期格式模式
- 時區示例
- Java I18N - UTC
- Unicode 轉換
- Java I18N - 從字串到字串的轉換
- Java I18N - 從 Reader 到 Writer 的轉換
- 相關教程
- Java 教程
- JDBC 教程
- SWING 教程
- AWT 教程
- Servlet 教程
- JSP 教程
- Java I18N 有用資源
- Java I18N - 快速指南
- Java I18N - 有用資源
- Java I18N - 討論
Java 國際化 - 快速指南
Java 國際化 - 概述
國際化或 I18N 指的是應用程式能夠為多個不同語言的使用者提供服務的能力。Java 內建了對國際化的支援。Java 還提供數字、貨幣的格式化以及日期和時間的相應調整。
Java 國際化有助於使 Java 應用程式能夠處理不同的語言、數字格式、貨幣、特定區域的時間格式。
本地化
本地化或 L10N 是應用程式的適應性,即應用程式如何根據特定的語言、數字格式、日期和時間設定等進行調整。
為了能夠進行本地化,Java 應用程式應該進行國際化。
文化相關資訊
以下資訊項通常會因不同的時區或文化而異。
訊息
日期
時間
數字
貨幣
度量衡
電話號碼
郵政地址
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:\Program Files\java\jdk\bin”。
為 Linux、UNIX、Solaris、FreeBSD 設定路徑
環境變數 PATH 應設定為指向 Java 二進位制檔案安裝的位置。如果您在執行此操作時遇到問題,請參考您的 shell 文件。
例如,如果您使用bash作為您的 shell,則您將在“.bashrc”的末尾新增以下行:export PATH = /path/to/java:$PATH'
流行的 Java 編輯器
要編寫 Java 程式,您將需要一個文字編輯器。市場上甚至還有更復雜的 IDE 可供使用。但目前,您可以考慮以下其中一個 -
記事本 - 在 Windows 計算機上,您可以使用任何簡單的文字編輯器,如記事本(本教程推薦使用),TextPad。
Netbeans - 一個開源且免費的 Java IDE,可以從 https://www.netbeans.org/index.html 下載。
Eclipse - 由 Eclipse 開源社群開發的 Java IDE,可以從 https://www.eclipse.org/ 下載。
接下來是什麼?
下一章將教您如何編寫和執行您的第一個 Java 程式以及開發應用程式所需的一些重要的基本 Java 語法。
Java 國際化 - Locale 類
Locale 物件表示特定的地理/政治/文化區域。任何需要 Locale 來執行其任務的操作都稱為區域設定敏感操作,並使用 Locale 來掌握與使用者相關的資訊。例如,顯示數字是一個區域設定敏感操作。數字應根據使用者本國、地區或文化的習俗和慣例進行格式化。
Locale 內容
Locale 物件包含以下內容
語言 - ISO 639 alpha-2 或 alpha-3 語言程式碼,或最多 8 個字母的已註冊語言子標籤。如果同時存在 alpha-2 和 alpha-3 程式碼,則必須使用 alpha-2 程式碼。語言欄位不區分大小寫,但 Locale 始終規範化為小寫。
指令碼 - ISO 15924 alpha-4 指令碼程式碼。指令碼欄位不區分大小寫,但 Locale 始終規範化為標題大小寫。
國家/地區 - ISO 3166 alpha-2 國家程式碼或聯合國 M.49 數字 3 區號。國家/地區欄位不區分大小寫,但 Locale 始終規範化為大寫。
變體 - 用於指示 Locale 變體的任意值。當有兩個或多個變體值,每個值都指示其自己的語義時,這些值應按重要性排序,最重要的值排在最前面,並用下劃線(_)分隔。變體欄位區分大小寫。
擴充套件 - 從單個字元鍵到字串值的對映,指示除語言識別之外的擴充套件。Locale 中的擴充套件實現 BCP 47 擴充套件子標籤和專用用途子標籤的語義和語法。擴充套件不區分大小寫,但 Locale 將所有擴充套件鍵和值規範化為小寫。
Java 國際化 - 示例 - Locale 細節
在本例中,我們將獲取預設區域設定並列印其詳細資訊。然後為“fr”建立一個區域設定並列印其詳細資訊。
示例
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 國際化 - 示例 - 顯示語言
在本例中,我們將獲取作為引數傳遞的區域設定的顯示語言。
示例
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 表示英語(美國)的區域設定。
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 物件從屬性檔案中顯示特定於區域設定的值。
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。
對於對映到區域設定的屬性檔案,可以以兩種方式附加字首。message_fr.properties 等效於 message_fr_FR.properties。
Java 國際化 - NumberFormat 類
java.text.NumberFormat 類用於根據特定的區域設定格式化數字和貨幣。數字格式因國家/地區而異。例如,在丹麥,數字的小數部分與整數部分用逗號分隔,而在英國,他們使用點作為分隔符。
示例 - 格式化數字
在本例中,我們將根據美國區域設定和丹麥區域設定格式化數字。
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 國際化 - 格式化貨幣
示例
在本例中,我們將根據美國區域設定和丹麥區域設定格式化貨幣。
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 國際化 - 格式化百分比
示例
在本例中,我們將數字格式化為百分比格式。
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 國際化 - 設定最小/最大精度
示例
在本例中,我們將為數字的整數部分和小數部分設定最小和最大位數。
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 國際化 - 設定舍入模式
示例
在本例中,我們將展示舍入模式。
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 國際化 - 解析數字
示例
在本例中,我們將展示存在於不同區域設定中的數字的解析。
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 類用於根據自定義格式和區域設定格式化數字。
示例 - 格式化數字
在本例中,我們將根據給定的模式格式化數字。
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 | ' 在特殊字元周圍加上引號。 |
示例
在本例中,我們將根據不同的模式格式化數字。
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 物件時更改預設區域設定。在下面的示例中,我們將對兩個不同的區域設定使用相同的模式,您可以發現輸出結果的差異。
示例
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 類,可以更改預設的分隔符符號、分組分隔符符號等。以下示例說明了這一點。
示例
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() 方法,可以更改數字的預設分組。以下示例說明了這一點。
示例
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 類。
示例
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
示例
在以下示例中,我們將展示如何使用不同的格式。
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() 方法。請參見下面的示例。
示例
在以下示例中,我們將展示如何使用不同的格式來格式化時間。
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() 方法。請參見下面的示例。
示例
在以下示例中,我們將展示如何使用不同的格式來格式化日期和時間。
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 類的示例。
示例
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 類的示例。
示例
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 類,可以更改預設的分隔符符號、分組分隔符符號等。以下示例說明了這一點。
示例
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 月的第一個星期四)。 |
| 13 | w 顯示一年中的星期(1-53)。 |
| 14 | W 顯示一個月中的星期(0-5) |
| 15 | a 顯示 AM/PM |
| 16 | k 顯示一天中的小時(1-24)。 |
| 17 | K 顯示一天中的小時,AM/PM(0-11)。 |
| 18 | z 顯示時區。 |
示例
在本例中,我們將根據不同的模式格式化日期。
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 時間加一小時。它獨立於夏令時,應用於在資料庫中儲存日期和時間。
時區轉換
以下示例將展示各種時區的轉換。我們將列印一天中的小時和以毫秒為單位的時間。第一個將變化,第二個將保持不變。
示例
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
可用的時區
以下示例將展示系統可用的時區。
示例
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 位元組陣列。
示例
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 轉換
Reader 和 Writer 類是面向字元的流類。這些類可用於讀取和轉換 Unicode 字元。
轉換
以下示例將展示如何使用 Reader 和 Writer 類將 Unicode 字串轉換為 UTF8 位元組陣列以及如何將 UTF8 位元組陣列轉換為 Unicode 位元組陣列。
示例
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