Java 国际化 - 快速指南
Java 国际化 - 概述
国际化或 I18N 是指应用程序能够为多种不同语言的用户提供服务的能力。Java 内置了对国际化的支持。Java 还提供数字、货币的格式以及相应的日期和时间调整。
Java 国际化有助于使 Java 应用程序处理不同的语言、数字格式、货币、特定区域的时间格式。
本地化
本地化或 L10N 是应用程序的适应性,即应用程序如何适应特定的语言、数字格式、日期和时间设置等。
Java 应用程序应该进行国际化,以便能够进行本地化。
文化相关信息
以下信息项通常因时区或文化的不同而不同。
消息
日期
时间
数字
货币
测量值
电话号码
邮政地址
GUI 标签
国际化类
Java 有一组内置类,可帮助应用程序实现国际化。这些类如下:
| Sr.No. | Class &描述 |
|---|---|
| 1 | Locale 表示语言以及国家/地区。 |
| 2 | ResourceBundle 包含本地化的文本或对象。 |
| 3 | NumberFormat 用于根据语言环境格式化数字/货币。 |
| 4 | DecimalFormat 用于根据自定义格式和语言环境格式化数字。 |
| 5 | DateFormat 用于根据语言环境格式化日期。 |
| 6 | SimpleDateFormat 用于根据自定义格式和语言环境格式化日期。 |
Java 国际化 - 环境设置
在本章中,我们将讨论为 Java 设置合适环境的不同方面。
本地环境设置
如果您仍愿意为 Java 编程语言设置环境,那么本节将指导您如何在您的机器上下载和设置 Java。以下是设置环境的步骤。
Java SE 可从链接下载 Java免费获得。您可以根据您的操作系统下载版本。
按照说明下载 Java 并运行 .exe 以在您的机器上安装 Java。在计算机上安装 Java 后,您需要设置环境变量以指向正确的安装目录 −
设置 Windows 的路径
假设您已在 c:\Program Files\java\jdk 目录中安装了 Java −
右键单击"我的电脑",然后选择"属性"。
单击"高级"选项卡下的"环境变量"按钮。
现在,更改"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 始终规范化为小写。
Script - ISO 15924 alpha-4 脚本代码。脚本字段不区分大小写,但 Locale 始终规范化为标题大小写。
国家(地区) - ISO 3166 alpha-2 国家代码或 UN M.49 numeric-3 区域代码。国家字段不区分大小写,但 Locale 始终规范化为大写。
变体 - 用于指示 Locale 变体的任意值。如果有两个或多个变体值,每个值都表示自己的语义,则这些值应按重要性排序,最重要的值放在第一位,并用下划线 ('_') 分隔。变体字段区分大小写。
扩展 - 从单个字符键到字符串值的映射,指示除语言标识之外的扩展。Locale 中的扩展实现了 BCP 47 扩展子标签和私有使用子标签的语义和语法。扩展不区分大小写,但 Locale 将所有扩展键和值规范化为小写。
Java 国际化 - 示例 - 区域设置详细信息
在此示例中,我们将获取默认区域设置并打印其详细信息。然后为"fr"创建一个区域设置并打印其详细信息。
示例
import java.util.Locale;
public class I18NTester {
public static void main(String[] args) {
Locale locale =Locale.getDefault();
System.out.println("Default Locale Properties:
");
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("
fr Locale Properties:
");
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 国际化 - 格式模式
以下是格式模式中字符的使用。
| Sr.No. | Class &描述 |
|---|---|
| 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
Locale 可用于在 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 国际化 - 日期格式模式
以下是日期格式模式中字符的使用。
| Sr.No. | 类别与说明 |
|---|---|
| 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 byte[] 的转换以及 UTF8 byte[] 与 Unicode byte[] 的转换。
示例
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" ;
//将 Unicode 转换为 UTF8 格式
byte[] utf8Bytes = unicodeString.getBytes(Charset.forName("UTF-8"));
printBytes(utf8Bytes, "UTF 8 Bytes");
//将 UTF8 格式转换为 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 转换 from/to Reader/Writer
Reader 和 Writer 类是面向字符的流类。它们可用于读取和转换 Unicode 字符。
转换
以下示例将展示使用 Reader 和 Writer 类将 Unicode 字符串转换为 UTF8 byte[] 以及将 UTF8 byte[] 转换为 Unicode byte[]。
示例
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

