- JAVA内化教程
- JAVA I18N - 主页
- JAVA I18N - 概述
- JAVA I18N - 环境设置
- Locale 类示例
- JAVA I18N - 区域设置类
- JAVA I18N - 语言环境详细信息
- 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 I18N - DateFormat 类
- JAVA I18N - 格式化日期
- JAVA I18N - 格式化时间
- JAVA I18N - 格式化日期和时间
- SimpleDateFormat 类示例
- JAVA I18N - SimpleDateFormat 类
- JAVA I18N - 格式化日期
- JAVA I18N - DateFormatSymbols 类
- JAVA I18N - 日期格式模式
- 时区示例
- JAVA I18N - UTC
- 统一码转换
- JAVA I18N - 从字符串到字符串的转换
- JAVA I18N - 从读取器到写入器的转换
- JAVA内化有用资源
- Java I18N - 快速指南
- Java I18N - 有用的资源
- Java I18N - 讨论
Java 内化 - 快速指南
Java 内部化 - 概述
内化
国际化或 I18N 是指应用程序能够以多种不同语言为用户提供服务的能力。Java 具有对内部化的内置支持。Java 还提供数字、货币的格式化以及相应的日期和时间调整。
Java 国际化有助于使 Java 应用程序处理不同的语言、数字格式、货币、区域特定时间格式。
本土化
本地化或 L10N 是应用程序的适应性,即应用程序如何适应特定语言、数字格式、日期和时间设置等。
java 应用程序应该国际化,以便能够本地化自身。
文化相关信息
以下信息项通常会因不同时区或文化而异。
留言
日期
时间
数字
货币
测量
电话号码
邮政地址
图形用户界面标签
国际化课程
Java 有一组内置类,有助于应用程序的国际化。这些类如下:
先生。 | 类别和描述 |
---|---|
1 | 语言环境 代表一种语言以及国家/地区。 |
2 | 资源包 包含本地化的文本或对象。 |
3 | 数字格式 用于根据区域设置格式化数字/货币。 |
4 | 十进制格式 用于根据自定义格式和区域设置格式化数字。 |
5 | 日期格式 用于根据区域设置格式化日期。 |
6 | 简单日期格式 用于根据自定义格式和区域设置设置日期格式。 |
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 对象包含以下内容:
语言- ISO 639 alpha-2 或 alpha-3 语言代码,或最多 8 个字母的注册语言子标签。如果同时存在 alpha-2 和 alpha-3 代码,则必须使用 alpha-2 代码。语言字段不区分大小写,但 Locale 始终规范化为小写。
脚本- ISO 15924 alpha-4 脚本代码。脚本字段不区分大小写,但区域设置始终规范化为标题大小写。
国家(地区) - ISO 3166 alpha-2 国家代码或 UN M.49 numeric-3 区域代码。国家/地区字段不区分大小写,但 Locale 始终规范化为大写。
变体- 用于指示区域设置变体的任意值。如果有两个或多个变体值,每个值都指示其自己的语义,则这些值应按重要性排序,最重要的在前,用下划线('_')分隔。变体字段区分大小写。
扩展- 从单字符键到字符串值的映射,指示除语言识别之外的扩展。Locale 中的扩展实现了 BCP 47 扩展子标签和专用子标签的语义和语法。扩展不区分大小写,但 Locale 将所有扩展键和值规范化为小写。
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()); } }
输出
它将打印以下结果。
默认区域设置属性: 美国 英语 美国英语) 美国 英语 zh 我们 fr 区域设置属性: 法国 法语 法语(法国) 法国航空协会 弗拉 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)); } }
输出
它将打印以下结果。
英语 英国人 英语
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 对象来显示属性文件中的区域设置特定值。
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")); } }
输出
它将打印以下结果。
en_US 消息:欢迎来到TutorialsPoint.COM! fr_FR 中的消息:Bienvenue sur TutorialsPoint.COM!
命名约定注意事项
以下是属性文件的命名约定。
对于映射到默认区域设置的属性文件,不需要前缀。message_en_US.properties 等同于message.properties。
对于映射到区域设置的属性文件,可以通过两种方式附加前缀。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)); } }
输出
它将打印以下结果。
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 | 乙 指数格式的尾数和指数分隔符。 |
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)); } }
输出
它将打印以下结果。
1.23456789123E8 1,2345,6789.12
Java 内部化 - 区域设置特定的 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)); } }
输出
它将打印以下结果。
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())); } }
输出
它将打印以下结果。
2017 年 11 月 29 日 2017年11月29日
Java 内化 - 格式化日期
DateFormat 类提供了各种格式来格式化日期。以下是一些格式的列表。
日期格式.DEFAULT
日期格式.SHORT
日期格式.MEDIUM
日期格式.LONG
日期格式.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())); } }
输出
它将打印以下结果。
2017 年 11 月 29 日 2017 年 11 月 29 日 2017 年 11 月 29 日 2017 年 11 月 29 日 2017 年 11 月 29 日星期三
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 下午 4:11 下午 4:11:21 下午 4:11:21 国际标准时间 下午 4:11:21 国际标准时间
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())); } }
输出
它将打印以下结果。
2017 年 11 月 29 日 下午 4:16:13 2017 年 11 月 29 日 下午 4:16 2017 年 11 月 29 日 下午 4:16:13 2017 年 11 月 29 日下午 4:16:13 美国标准时间 美国标准时间 2017 年 11 月 29 日星期三下午 4:16:13
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)); } }
输出
它将打印以下结果。
2017 年 11 月 29 日星期三 17:01:22 国际标准时间 2017年11月29日 2017年11月29日
Java 内部化 - 特定于语言环境的 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)); } }
输出
它将打印以下结果。
2017 年 11 月 29 日星期三 17:48:14 国际标准时间 2017 年 11 月 星期三 2017 年 11 月
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 | 中号 显示月份。有效值 MM、MMM 或 MMMMM。 |
4 | d 显示月份中的某一天。有效值 d、dd。 |
5 | H 显示一天中的小时(上午 1-12 点/下午)。有效值hh。 |
6 | H 显示一天中的小时 (0-23)。有效值HH。 |
7 | 米 显示小时中的分钟 (0-59)。有效值毫米。 |
8 | s 显示分钟的秒数 (0-59)。有效值 ss. |
9 | S 显示分钟的毫秒数 (0-999)。有效值 SSS。 |
10 | 乙 显示星期几(例如星期一、星期二等) |
11 | D 显示一年中的日期 (1-366)。 |
12 | F 显示一个月中的星期几(例如 12 月的第一个星期四)。 |
13 | w 显示一年中的周 (1-53)。 |
14 | 瓦 显示月份中的周 (0-5) |
15 | A 显示上午/下午 |
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)); } }
输出
它将打印以下结果。
17年11月29日 2017年11月29日 2017-11-29 18:47:42 2017 年 11 月星期三 18:47:42.787+0530
Java 内部化 - UTC
UTC 代表协调世界时。它是时间标准,在世界各地普遍使用。所有时区均以 UTC 为偏移量进行比较计算。例如,丹麦哥本哈根的时间为 UTC + 1 表示 UTC 时间加一小时。它独立于夏令时,应用于在数据库中存储日期和时间。
时区转换
以下示例将展示各个时区的转换。我们将打印一天中的小时和以毫秒为单位的时间。第一个会有所不同,第二个将保持不变。
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()); } }
输出
它将打印以下结果。
世界标准时间:12 世界标准时间:1511956997540 注册PH:13 客服电话:1511956997540 纽约市:7 纽约: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); } } }
输出
它将打印以下结果。
时区 = Africa/阿比让 时区 = 非洲/阿克拉 ... 时区 = 夏令时
Java 内部化 - 字符串与 Unicode 之间的转换
在java中,文本内部以Unicode格式存储。如果输入/输出的格式不同,则需要转换。
转换
以下示例将展示 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]); } } }
输出
它将打印以下结果。
UTF 8 字节[0] = -61 UTF 8 字节[1] = -122 UTF 8 字节[2] = -61 UTF 8 字节[3] = -104 UTF 8 字节[4] = -61 UTF 8 字节[5] = -123 Unicode 字节[0] = -58 Unicode 字节[1] = -40 Unicode 字节[2] = -59
Java 内部化 - 读写器/写入器之间的 Unicode 转换
Reader 和 Writer 类是面向字符的流类。它们可用于读取和转换 Unicode 字符。
转换
以下示例将展示使用 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); } }
输出
它将打印以下结果。
这是示例文本 这是示例文本打印