Java I18N - 快速指南
Java Internalization - Overview
内化 (Internalization)
内部化或I18N指的是能够以多种语言和不同语言服务用户的应用程序的能力。 Java内置了内置支持。 Java还相应地提供数字,货币的形成以及日期和时间的调整。
Java国际化有助于使Java应用程序处理不同的语言,数字格式,货币,区域特定的时间格式。
本地化(Localization)
本地化或L10N是应用程序的自适应性,它是应用程序如何使用特定语言,数字格式,日期和时间设置等进行自适应的。
java应用程序应该国际化,以便能够本地化。
文化依赖信息
以下信息项目通常因不同的时区或文化而异。
Messages
Date
Time
Number
Currency
Measurements
电话号码
邮政地址
GUI标签
国际化课程
Java有一组内置类,有助于应用程序的国际化。 这些课程如下:
Sr.No. | 类和描述 |
---|---|
1 | Locale 表示语言以及国家/地区。 |
2 | ResourceBundle 包含本地化的文本或对象。 |
3 | NumberFormat 用于根据区域设置格式化数字/货币。 |
4 | DecimalFormat 用于根据自定义格式和按区域设置格式化数字。 |
5 | DateFormat 用于根据区域设置格式化日期。 |
6 | SimpleDateFormat 用于根据自定义格式和按区域设置格式化日期。 |
Java Internalization - Environment Setup
在本章中,我们将讨论为Java建立适宜环境的不同方面。
本地环境设置 (Local Environment Setup)
如果您仍然愿意为Java编程语言设置环境,那么本节将指导您如何在计算机上下载和设置Java。 以下是设置环境的步骤。
Java SE可从链接Download 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编辑器 (Popular Java Editors)
要编写Java程序,您需要一个文本编辑器。 市场上还有更复杂的IDE。 但就目前而言,您可以考虑以下其中一项 -
Notepad - 在Windows机器上,您可以使用任何简单的文本编辑器,如记事本(本教程推荐),TextPad。
Netbeans - 一个开源且免费的Java IDE,可从https://www.netbeans.org/index.html下载。
Eclipse - 由eclipse开源社区开发的Java IDE,可以从https://www.eclipse.org/下载。
接下来是什么 (What is Next?)
下一章将教您如何编写和运行您的第一个Java程序以及开发应用程序所需的Java中一些重要的基本语法。
Java Internalization - Locale Class
Locale对象代表特定的地理/政治/文化区域。 任何需要Locale执行其任务的操作称为区域设置敏感操作,并使用Locale来掌握与用户相关的信息。 例如,显示数字是区域设置敏感操作。 该号码应根据用户所在国家,地区或文化的习俗和惯例进行格式化。
区域设置内容
Locale对象包含以下内容:
Language - ISO 639 alpha-2或alpha-3语言代码,或注册语言子标签最多8个字母。 如果存在alpha-2和alpha-3代码,则必须使用alpha-2代码。 语言字段不区分大小写,但Locale始终标准化为小写。
Script - ISO 15924 alpha-4脚本代码。 脚本字段不区分大小写,但Locale始终标准化为标题大小写。
Country (region) - ISO 3166 alpha-2国家代码或UN M.49数字-3区号。 country字段不区分大小写,但Locale总是规范化为大写。
Variant - 用于指示区域设置变体的任意值。 如果有两个或多个变量值,每个变量值都指示其自己的语义,则这些值应按重要性排序,最重要的是,首先用下划线('_')分隔。 变体字段区分大小写。
Extensions - 从单个字符键到字符串值的映射,指示除语言标识之外的扩展。 Locale中的扩展实现了BCP 47扩展子标签和私有子标签的语义和语法。 扩展名不区分大小写,但Locale将所有扩展键和值规范化为小写。
Java Internalization - Example - Locale Details
在此示例中,我们将获取默认语言环境并打印其详细信息。 然后为“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());
}
}
输出 (Output)
它将打印以下结果。
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 Internalization - Example - Display Language
在这个例子中,我们将每个语言环境的显示语言作为参数传递。
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));
}
}
输出 (Output)
它将打印以下结果。
English
anglais
inglés
Java Internalization - ResourceBundle Class
ResourceBundle类用于存储区域敏感的文本和对象。 通常,我们使用属性文件来存储特定于语言环境的文本,然后使用ResourceBundle对象来表示它们。 以下是在基于Java的应用程序中使用特定于语言环境的属性文件的步骤。
第1步:创建属性文件。
假设我们需要英语语言环境的属性文件。 然后创建属性文件名XXX_en_US.properties,其中XXX是文件的名称,en_US表示英语(美国)的语言环境。
Messages_en_US.properties
message=Welcome to iowiki.com!
现在让我们为法语区域设置创建属性文件。 然后创建属性文件名XXX_fr_FR.properties,其中XXX是文件的名称,fr_FR表示法语(法国)的语言环境。
Messages_fr_FR.properties
message=Bienvenue sur iowiki.com!
在这里,您可以确定密钥是相同的,但值在属性文件中是特定于区域设置的。
第2步:创建ResourceBundle对象
使用以下语法创建具有属性文件名和语言环境的ResourceBundle对象。
ResourceBundle bundle = ResourceBundle.getBundle("Messages", Locale.US);
第3步:从ResourceBundle对象获取值。
通过传递密钥从ResourceBundle对象获取值。
String value = bundle.getString("message");
例子 (Example)
以下示例说明如何使用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"));
}
}
输出 (Output)
它将打印以下结果。
Message in en_US: Welcome to iowiki.com!
Message in fr_FR: Bienvenue sur iowiki.com!
命名约定注释
以下是属性文件的命名约定。
对于映射到默认语言环境的属性文件,不需要前缀。 message_en_US.properties等同于message.properties。
对于映射到语言环境的属性文件,可以通过两种方式附加前缀。 message_fr.properties等同于message_fr_FR.properties。
Java Internalization - NumberFormat Class
java.text.NumberFormat类用于根据特定的Locale格式化数字和货币。 数字格式因国家/地区而异。 例如,在丹麦,使用逗号将数字的分数与整数部分分开,而在英格兰,它们使用点作为分隔符。
示例 - 格式编号
在此示例中,我们根据美国语言环境和丹麦语区域设置格式化数字。
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));
}
}
输出 (Output)
它将打印以下结果。
100,76
100.76
Java Internalization - Format Currencies
在此示例中,我们根据美国区域设置和丹麦语区域设置格式化货币。
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));
}
}
输出 (Output)
它将打印以下结果。
kr 100,76
$100.76
Java Internalization - Format Percentages
在此示例中,我们以百分比格式格式化数字。
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));
}
}
输出 (Output)
它将打印以下结果。
76%
Java Internalization - Set Min/Max Precision
在这个例子中,我们设置整数的最小和最大数字以及数字的小数部分。
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));
}
}
输出 (Output)
它将打印以下结果。
234.763
Java Internalization - Set Rounding Mode
在这个例子中,我们展示了舍入模式。
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));
}
}
输出 (Output)
它将打印以下结果。
100
99
Java Internalization - Parsing Numbers
在这个例子中,我们展示了对不同语言环境中存在的数字的解析。
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"));
}
}
输出 (Output)
它将打印以下结果。
100.76
10076
Java Internalization - DecimalFormat Class
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));
}
}
输出 (Output)
它将打印以下结果。
1.23456789123E8
1,2345,6789.12
Java Internalization - Format Patterns
以下是在格式化模式中使用字符。
Sr.No. | 类和描述 |
---|---|
1 | 0 如果存在较少的数字则显示0。 |
2 | # 显示数字省略前导零。 |
3 | . 小数分隔符。 |
4 | , 分组分隔符。 |
5 | E 指数格式的尾数和指数分隔符。 |
6 | ; 格式分隔符。 |
7 | - 负数前缀。 |
8 | % 在乘以100后显示数字百分比。 |
9 | ? 在乘以1000后将数字显示为mille。 |
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));
}
}
输出 (Output)
它将打印以下结果。
1.23456789123E8
1,2345,6789.12
Java Internalization - Locale Specific DecimalFormat
默认情况下,DecimalFormat对象使用JVM的语言环境。 我们可以在使用NumberFormat类创建DecimalFormat对象时更改默认语言环境。 在下面的示例中,我们将对两个不同的区域设置使用相同的模式,您可以发现输出中的差异。
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));
}
}
输出 (Output)
它将打印以下结果。
123.45
123,45
Java Internalization - DecimalFormatSymbols Class
使用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));
}
}
输出 (Output)
它将打印以下结果。
126,473.457
126:473;457
Java Internalization - Grouping Digits
使用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));
}
}
输出 (Output)
它将打印以下结果。
1.212232324734567E11
121,223,232,473.457
1212,2323,2473.457
Java Internalization - DateFormat Class
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()));
}
}
输出 (Output)
它将打印以下结果。
Nov 29, 2017
29-11-2017
Java Internalization - Formatting Dates
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()));
}
}
输出 (Output)
它将打印以下结果。
Nov 29, 2017
11/29/17
Nov 29, 2017
November 29, 2017
Wednesday, November 29, 2017
Java Internalization - Formatting Time
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()));
}
}
输出 (Output)
它将打印以下结果。
4:11:21 PM
4:11 PM
4:11:21 PM
4:11:21 PM IST
4:11:21 PM IST
Java Internalization - Formatting Date and Time
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()));
}
}
输出 (Output)
它将打印以下结果。
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 Internalization - SimpleDateFormat Class
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));
}
}
输出 (Output)
它将打印以下结果。
Wed Nov 29 17:01:22 IST 2017
29-11-2017
29-11-2017
Java Internalization - Locale specific SimpleDateFormat
Locale可用于在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));
}
}
输出 (Output)
它将打印以下结果。
Wed Nov 29 17:48:14 IST 2017
Wednesday November 2017
onsdag november 2017
Java Internalization - DecimalFormatSymbols Class
使用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));
}
}
输出 (Output)
它将打印以下结果。
126,473.457
126:473;457
Java Internalization - Date Format Patterns
以下是在日期格式化模式中使用字符。
Sr.No. | 类和描述 |
---|---|
1 | G 要显示时代。 |
2 | y 显示年份。 有效值yy,yyyy。 |
3 | M 显示月份。 有效值MM,MMM或MMMMM。 |
4 | d 显示月份的日期。 有效值d,dd。 |
5 | h 显示一天中的小时(上午1-12点/下午)。 有效值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 显示小时,上午/下午(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));
}
}
输出 (Output)
它将打印以下结果。
29-11-17
11-29-2017
2017-11-29 18:47:42
Wednesday November 2017 18:47:42.787+0530
Java Internalization - UTC
UTC代表协调世界时。 它是时间标准,并且在世界各地普遍使用。 所有时区都与UTC相比计算为偏移量。 例如,丹麦哥本哈根的时间是UTC + 1表示UTC时间加一小时。 它独立于Day light节省,应该用于在数据库中存储日期和时间。
转换时区
以下示例将展示各种时区的转换。 我们将以毫秒为单位打印一天中的小时和时间。 首先会有所不同,第二个将保持不变。
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());
}
}
输出 (Output)
它将打印以下结果。
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);
}
}
}
输出 (Output)
它将打印以下结果。
Timezone = Africa/Abidjan
Timezone = Africa/Accra
...
Timezone = VST
Java Internalization - Unicode Conversion from/to String
在java中,文本内部以Unicode格式存储。 如果输入/输出格式不同,则需要进行转换。
转换 (Conversion)
下面的示例将展示Unicode字符串到UTF8 byte []和UTF8 byte []到Unicode byte []的转换。
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]);
}
}
}
输出 (Output)
它将打印以下结果。
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 Internalization - Unicode Conversion from/to Reader/Writer
Reader和Writer类是面向字符的流类。 这些可用于读取和转换Unicode字符。
转换 (Conversion)
下面的示例将展示使用Reader和Writer类将Unicode字符串转换为UTF8 byte []和UTF8 byte []到Unicode byte []。
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);
}
}
输出 (Output)
它将打印以下结果。
This is a sample text
This is a sample text