Java日期时间 – 自定义日期格式模式
下面的列表显示了我们可以用来创建自定义数据格式模式的格式符号。
- G
时代
例如:G AD GGGG Anno Domini GGGGG A
- u
年
它可以是正数或负数。年是正数在一个时代开始日期之后。年份是时代开始日期之前的负数。2014年AD是2014年和2014年BC是-2014年。
例如:u/uuu/uuuu 2014 uu 12 uuuuu 02014
- y
年代
它计算从时代开始日期向前或向后的年份。它总是一个正数。2014年AD是2014年和2014年BC是2015年。在共同时代,0年是1 BC。
例如:y/yyy/yyyy 2014 yy 12 yyyyy 02014
- D
一年中的(1 -366)
例如:D 150
- M/L
月份
例如:M 5 MM 05 MMM Jul MMMM July
- d
日期
例如:
d 21 dd 01 ddd 001 ddd 029
每年的季度
例如:
Q 3 QQ 03 QQQ Q3 QQQQ 3rd quarter
每周一年
例如:
Y 2014 YY 12 YYY/YYYY 2014
周为基础的年度
例如:
w 31
周月
例如:
W 2
星期中的一天
例如:
E 7 EE 07 EEE Sun EEEEE Sunday
每月的星期几
例如:
F 1
上午/下午
例如:
a AM
时钟小时AM/PM(1-12)
例如:
h 2
上午/下午时间(0-11)
例如:
K 3
时钟小时AM/PM(1-24)
例如:
k 7
时段(0-23)
例如:
H 7 HH 07
分钟
例如:
mm 21
秒钟
例如:
ss 12
第二部分
例如:
SSSSSSSSS 000006789
毫秒
例如:
A 12014012
第二个纳秒
例如:
n 789
纳秒
例如:
N 12014012001289
时区ID
例如:
VV America/Chicago
时区名称
例如:
z CDT
区域偏移
例如:
Z -0500 ZZ -0500 ZZZ -05:00 ZZZZ GMT-05:00
局部区偏移
例如:
O GMT-5
区域偏移
例如:
X +09 XX +0930 XXX +09:30 XXX -05:00 XXXX +093045 XXXXX +08:30:45
与X相同,除了它为区域偏移零而不是“Z”打印“+00”。
例如:
xx -0500
用空格填充模式。p的数量决定了输出的宽度。
例如:
mm 30 pppmm " 30"
文本转义。
单引号内的文本直接输出。
要输出单个报价,请使用两个连续的单引号。
例如:
"Hello" MMMM Hello July
单引号
例如:
"""Hello""" MMMM "Hello" July
符号[和]表示可选部分。 只有当信息可用于所有元素时,才会输出包含在可选节中的模式。
保留供将来使用。
例子
import java.time.LocalDate; import java.time.Month; import java.time.format.DateTimeFormatter; import java.time.temporal.Temporal; import java.util.Locale; public class Main { public static void main(String[] args) { LocalDate ld = LocalDate.of(2014, Month.JUNE, 30); format(ld, "M/d/yyyy"); format(ld, "MM/dd/yyyy"); format(ld, "MMM dd, yyyy"); format(ld, "MMMM dd, yyyy"); format(ld, "EEEE, MMMM dd, yyyy"); format(ld, ""Month" q "in" QQQ"); } public static void format(Temporal co, String pattern) { DateTimeFormatter fmt = DateTimeFormatter.ofPattern(pattern); String str = fmt.format(co); System.out.println(pattern + ": " + str); } }
上面的代码生成以下结果。
使用区域设置的自定义日期格式
我们可以使用DateTimeFormatter类的Ptern()方法创建一个具有指定格式模式和语言环境的DateTimeFormatter对象。
static DateTimeFormatter ofPattern(String pattern) static DateTimeFormatter ofPattern(String pattern, Locale locale)
以下代码显示如何创建两个格式化程序,以便在默认语言环境和德语语言环境中以“Month day,Year”格式设置日期格式。
DateTimeFormatter fmt1 = DateTimeFormatter.ofPattern("MMMM dd, yyyy"); DateTimeFormatter fmt2 = DateTimeFormatter.ofPattern("MMMM dd, yyyy", Locale.GERMAN);
DateTimeFormatter
类withLocale()方法从同一模式返回指定区域设置的DateTimeFormatter对象。
DateTimeFormatter fmt2 = fmt1.withLocale(Locale.GERMAN);
DateTimeFormatter
类中的 getLocale()
方法返回当前格式化程序的语言环境。
例2
import java.time.LocalDate; import java.time.LocalTime; import java.time.Month; import java.time.ZoneId; import java.time.ZonedDateTime; import java.time.format.DateTimeFormatter; import java.time.temporal.Temporal; import java.util.Locale; public class Main { public static void main(String[] args) { LocalTime lt = LocalTime.of(16, 30, 5, 78899); format(lt, "HH:mm:ss"); format(lt, "KK:mm:ss a"); format(lt, "[MM-dd-yyyy][" at" HH:mm:ss]"); ZoneId usCentral = ZoneId.of("America/Chicago"); ZonedDateTime zdt = ZonedDateTime.of(LocalDate.now(), lt, usCentral); format(zdt, "MM/dd/yyyy HH:mm:ssXXX"); format(zdt, "MM/dd/yyyy VV"); format(zdt, "[MM-dd-yyyy][" at" HH:mm:ss]"); } public static void format(Temporal co, String pattern) { DateTimeFormatter fmt = DateTimeFormatter.ofPattern(pattern, Locale.US); String str = fmt.format(co); System.out.println(pattern + ": " + str); } }
上面的代码生成以下结果。
自定义日期格式与可选
定义自定义日期时间格式时我们可以使用符号 [
和]
以标记可选部分。
只有当信息可用于所有元素时,才会输出包含在可选节中的模式。
以下代码显示如何使用可选格式。
import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; import java.time.Month; import java.time.format.DateTimeFormatter; public class Main { public static void main(String[] args) { String pattern = "MM/dd/yyyy[ "at" HH:mm:ss]"; DateTimeFormatter fmt = DateTimeFormatter.ofPattern(pattern); LocalDate ld = LocalDate.of(2014, Month.JUNE, 30); LocalTime lt = LocalTime.of(17, 30, 12); LocalDateTime ldt = LocalDateTime.of(ld, lt); String str1 = fmt.format(ld); System.out.println(str1); String str2 = fmt.format(ldt); System.out.println(str2); } }
上面的代码生成以下结果。
Java DateTimeFormatterBuilder
我们可以从 DateTimeFormatterBuilder
创建自定义日期时间格式。
以下代码构建一个 DateTimeFormatter
对象以格式化日期格式,例如“YEAR中的新年度在WEEK_DAY”:
import java.time.LocalDate; import java.time.Month; import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatterBuilder; import java.time.format.TextStyle; import java.time.temporal.ChronoField; public class Main { public static void main(String[] args) { DateTimeFormatter formatter = new DateTimeFormatterBuilder() .appendLiteral("New Year in ") .appendValue(ChronoField.YEAR) .appendLiteral(" is on ") .appendText(ChronoField.DAY_OF_WEEK,TextStyle.FULL_STANDALONE) .toFormatter(); LocalDate ld = LocalDate.of(2014, Month.JANUARY, 1); String str = ld.format(formatter); System.out.println(str); } }
上面的代码生成以下结果。
例3
我们可以使用DateTimeFormatterBuilder中的模式创建相同的自定义格式化程序。
import java.time.LocalDate; import java.time.Month; import java.time.format.DateTimeFormatter; public class Main { public static void main(String[] args) { LocalDate ld = LocalDate.of(2014,Month.JANUARY,1); String pattern = ""New Year in" yyyy "is on" EEEE"; DateTimeFormatter formatter = DateTimeFormatter.ofPattern(pattern); String str = ld.format(formatter); System.out.println(str); } }
上面的代码生成以下结果。