Java SimpleDateFormat – Java 日期格式

介绍

Java 的 SimpleDateFormatDateFormat 类用于日期格式化。它主要用于我们需要显示或利用 Java 的日期和时间功能的地方。这两个类都位于 com.text 包中。

Java 的 DateFormat

  • DateFormat 用于根据提供的特定区域设置将日期格式化为 String
  • 区域设置用于指定代码更具地区性的地区和语言。
  • 不同地区的日期写法不同。例如,2017年12月31日 在印度写作 31-12-2017,但在美国写作 12-31-2017
  • DateFormat 类不是线程同步的,建议为每个线程创建单独的实例。

A DateFormat object can be created using the getDateInstance() and getTimeInstance() method of the DateFormat class.

Locale loc = new Locale("en", "US");
DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.DEFAULT, loc);

注意:自版本19起,构造函数 Locale(String, String) 已弃用。

Locale loc = new Locale.Builder().setLanguage("en").setRegion("US").build();

getDateInstance方法需要两个输入参数。第一个参数指定要使用的DateFormat,第二个参数是区域设置。

使用format

DateFormat类有一个format方法负责格式化。

Locale locale = new Locale("fr", "FR");
DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.DEFAULT, locale);
String date = dateFormat.format(new Date());
System.out.print(date);

此代码将日期格式化为法语(fr)语言和法国(FR)地区:

Output
3 janv. 2018

使用getTimeInstance()

要创建DateFormat实例,我们使用getDateInstance()方法。

要执行时间格式化,我们需要一个时间实例。我们将使用getTimeInstance()方法获取时间实例。

Locale locale = new Locale("fr", "FR");
DateFormat dateFormat = DateFormat.getTimeInstance(DateFormat.DEFAULT, locale);
String date = dateFormat.format(new Date());
System.out.print(date);

此代码将时间格式化为法语(fr)语言和法国(FR)地区:

Output
11:03:01

JavaSimpleDateFormat

SimpleDateFormat 类似于 DateFormat。它们之间唯一的主要区别是,SimpleDateFormat 可以用于格式化(DateString 转换)和解析(StringDate 转换)并支持区域设置,而 DateFormat 不支持区域设置。DateFormat 是一个抽象类,提供了日期格式化和解析的基本支持。SimpleDateFormat 是扩展了 DateFormat 类的具体类。

SimpleDateFormat 可以使用 SimpleDateFormat 构造函数创建。构造函数是一个带参数的构造函数,需要一个 String 模式作为参数。

String pattern = "MM-dd-yyyy";
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(pattern);

字符串 pattern 是用于格式化日期的模式,输出将以该模式生成为“MM-dd-yyyy”。

模式

让我们来看看应该用于格式化模式的模式语法。

Letter for Pattern Date or Time component Examples
G Era designator AD
y Year 2018 (yyyy), 18 (yy)
M Month in year July (MMMM), Jul (MMM), 07 (MM)
w Results in week in year 16
W Results in week in month 3
D Gives the day count in the year 266
d Day of the month 09 (dd), 9(d)
F Day of the week in month 4
E Day name in the week Tuesday, Tue
u Day number of week where 1 represents Monday, 2 represents Tuesday and so on 2
a AM or PM marker AM
H Hour in the day (0-23) 12
k Hour in the day (1-24) 23
K Hour in am/pm for 12 hour format (0-11) 0
h Hour in am/pm for 12 hour format (1-12) 12
m Minute in the hour 59
s Second in the minute 35
S Millisecond in the minute 978
z Timezone Pacific Standard Time; PST; GMT-08:00
Z Timezone offset in hours (RFC pattern) -0800
X Timezone offset in ISO format -08; -0800; -08:00

一些字母应该以不同的数量用于不同的结果,比如月份:

Type Pattern Example Output
Full Month MMMM July
Abbreviated Month MMM Jul
Numeric Month MM 07

示例

现在让我们看一些不同日期和时间格式的示例。

Pattern Result
MM/dd/yyyy 01/02/2018
dd-M-yyyy hh:mm:ss 02-1-2018 06:07:59
dd MMMM yyyy 02 January 2018
dd MMMM yyyy zzzz 02 January 2018 India Standard Time
E, dd MMM yyyy HH:mm:ss z Tue, 02 Jan 2018 18:07:59 IST

使用SimpleDateFormat()

为了解析日期,我们需要使用构造函数创建SimpleDateFormat的实例,然后使用format()方法:

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

这段代码将输出“MM-dd-yyyy”:

Output
01-02-2018

该模式生成“年中的月份”、“月中的日期”和“年份”。字符类型(大小写)和字符数量都对字符串起作用。月份将表示为两位数字,日期将表示为两位数字,年份将表示为四位数字。

这段代码将“2018年1月2日”的日期显示为“01-02-2018”。

对于解析时间,我们必须在创建SimpleDateFormat实例时更改模式。

String pattern = "HH:mm:ss.SSSZ";
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(pattern);
String date = simpleDateFormat.format(new Date());
System.out.println(date);

这段代码将输出“HH:mm:ss.SSSZ”:

Output
13:03:15.454+0530

该模式生成“小时”、“分钟”、“秒”、“毫秒”和“时区偏移量(RFC模式)”。

这段代码将时间显示为“13:03:15.454+0530”。

使用parse()

解析是将字符串转换为`java.util.Date`实例。我们可以使用`SimpleDateFormat`类的`parse()`方法将字符串解析为日期实例。为了将字符串解析为日期,我们需要`SimpleDateFormat`类的实例和一个字符串模式作为该类构造函数的输入。

String pattern = "MM-dd-yyyy";
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(pattern);
Date date = simpleDateFormat.parse("12-01-2018");
System.out.println(date);

这将输出一个日期(12-01-2018)没有指定时间:

Output
Sat Dec 01 00:00:00 IST 2018

现在让我们看一个`SimpleDateFormat`的示例来解析时间。

String pattern = "HH:mm:ss";
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(pattern);
Date date = simpleDateFormat.parse("22:00:03");
System.out.println(date);

这将输出一个时间(22:00:03)没有指定日期:

Output
Thu Jan 01 22:00:03 IST 1970

因为我们没有指定任何日期,程序将纪元视为日期(即01-Jan-1970)。

使用Locale

我们已经在DateFormat的一部分中使用了Locale,并且我们已经看到区域是基于地区使用的。

String pattern = "EEEEE MMMMM yyyy HH:mm:ss.SSSZ";
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(pattern, new Locale("fr", "FR"));
Date date = simpleDateFormat.format(new Date());
System.out.println(date);

此代码将以法语(fr)语言和法国(FR)地区格式化当前时间:

Output
mardi janvier 2018 14:51:02.354+0530

根据提供的Locale,法语中的日和月份被命名 – mardi是“星期二”,janvier是“一月”。

结论

在这篇文章中,你学到了关于Java的SimpleDateFormatDateFormat

参考:

Source:
https://www.digitalocean.com/community/tutorials/java-simpledateformat-java-date-format