常规方法格式化时间(SimpleDateFormat)
通常来讲,在Java中格式化时间,可以使用SimpleDateFormat类。以下是一个示例代码:
import java.text.SimpleDateFormat;
import java.util.Date;
public class Main {
public static void main(String[] args) {
// 获取当前时间
Date now = new Date();
// 创建SimpleDateFormat对象,指定日期格式
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
// 格式化时间
String formattedTime = sdf.format(now);
// 输出格式化后的时间
System.out.println("Formatted time: " + formattedTime);
}
}
在上面的示例中,我们使用SimpleDateFormat
类来格式化时间。我们获取当前时间now
,然后创建一个SimpleDateFormat
对象sdf
,并指定日期格式为"yyyy-MM-dd HH:mm:ss"
。最后,我们使用sdf.format(now)
方法将时间格式化为指定格式的字符串,并将其存储在formattedTime
变量中。最后,我们将格式化后的时间输出到控制台。使用时可以根据自己的需求修改日期格式,例如"yyyy年MM月dd日 HH:mm:ss"
或"MM/dd/yyyy HH:mm:ss"
等。
格式化时间新玩法(DateTimeFormatter)
DateTimeFormatter
是Java 8中引入的一个类,用于格式化和解析日期时间对象。它可以将日期时间对象转换为指定格式的字符串,也可以将字符串解析为对应的日期时间对象。
使用DateTimeFormatter
需要先创建一个DateTimeFormatter
对象,然后使用其提供的方法进行格式化或解析操作。常用的方法包括:
ofPattern(String pattern)
:根据指定的模式字符串创建一个DateTimeFormatter
对象。format(TemporalAccessor temporal)
:将指定的日期时间对象格式化为字符串。parse(CharSequence text)
:将指定的字符串解析为日期时间对象。
本地化时间
DateTimeFormatter结合枚举FormatStyle定义的风格可以简单实现本地化时间的格式化
首先,需要导入java.time.format.DateTimeFormatter类。在Java 8及以上版本中,该类已经包含在java.time包中。
创建一个DateTimeFormatter对象,并使用ofLocalizedDateTime方法指定要使用的格式化风格和区域设置。例如,可以使用DateTimeFormatter.ofLocalizedDateTime(FormatStyle.LONG).withLocale(Locale.CHINA)来创建一个适用于中国地区的长日期时间格式化器。
使用DateTimeFormatter的format方法将日期时间对象格式化为本地化的字符串。例如,可以使用formatter.format(LocalDateTime.now())来将当前日期时间格式化为本地化的字符串。
下面是示例代码:
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.time.format.FormatStyle;
import java.util.Locale;
public class DateTimeFormatterExample {
public static void main(String[] args) {
// 创建一个适用于中国地区的长日期时间格式化器
DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.LONG);
// 将当前日期时间格式化为本地化的字符串
String formattedDateTime = formatter.format(LocalDateTime.now());
System.out.println("本地化时间:" + formattedDateTime);
}
}
输出结果将会是类似于以下格式的本地化时间:
本地化时间:2023年9月30日 下午10时15分32秒
如果你时区在美国,格式化结果为:
Sep 30, 2023, 10:21:10 PM
ISO/RFC规范格式
ISO/RFC规范是一种常用的日期时间格式规范,可以使用DateTimeFormatter来实现。
以下是ISO/RFC规范中常用的日期时间格式及其对应的DateTimeFormatter格式化模式:
- ISO日期格式(例如:2021-01-01):
DateTimeFormatter.ISO_DATE
- ISO时间格式(例如:10:30:00):
DateTimeFormatter.ISO_TIME
- ISO日期时间格式(例如:2021-01-01T10:30:00):
DateTimeFormatter.ISO_DATE_TIME
- ISO偏移日期时间格式(例如:2021-01-01T10:30:00+08:00):
DateTimeFormatter.ISO_OFFSET_DATE_TIME
- RFC_1123日期时间格式(例如:Fri, 01 Jan 2021 10:30:00 GMT):
DateTimeFormatter.RFC_1123_DATE_TIME
使用DateTimeFormatter进行格式化示例代码:
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
public class Main {
public static void main(String[] args) {
LocalDateTime dateTime = LocalDateTime.now();
DateTimeFormatter isoDateFormatter = DateTimeFormatter.ISO_DATE;
String isoDate = dateTime.format(isoDateFormatter);
System.out.println("ISO日期格式:" + isoDate);
DateTimeFormatter isoTimeFormatter = DateTimeFormatter.ISO_TIME;
String isoTime = dateTime.format(isoTimeFormatter);
System.out.println("ISO时间格式:" + isoTime);
DateTimeFormatter isoDateTimeFormatter = DateTimeFormatter.ISO_DATE_TIME;
String isoDateTime = dateTime.format(isoDateTimeFormatter);
System.out.println("ISO日期时间格式:" + isoDateTime);
DateTimeFormatter isoOffsetDateTimeFormatter = DateTimeFormatter.ISO_OFFSET_DATE_TIME;
String isoOffsetDateTime = dateTime.format(isoOffsetDateTimeFormatter);
System.out.println("ISO偏移日期时间格式:" + isoOffsetDateTime);
DateTimeFormatter rfc1123DateTimeFormatter = DateTimeFormatter.RFC_1123_DATE_TIME;
String rfc1123DateTime = dateTime.format(rfc1123DateTimeFormatter);
System.out.println("RFC_1123日期时间格式:" + rfc1123DateTime);
}
}
输出结果如下:
ISO日期格式:2023-09-30
ISO时间格式:10:30:00
ISO日期时间格式:2023-09-30T10:30:00
ISO偏移日期时间格式:2023-09-30T10:30:00+08:00
RFC_1123日期时间格式:Sat, 30 Sep 2023 10:30:00 GMT
范式(Patterns)格式化
这种方式应该是我们最常用的方式了,范式格式化是一种用于格式化时间和日期的模式。下面是一些常见的时间日期范式及其对应的格式化方式:
年份:
YYYY
:4位数字表示的年份,例如:2023yyyy
:4位数字表示的年份,例如:2023YY
:2位数字表示的年份,例如:23
月份:
MM
:2位数字表示的月份,例如:01表示一月,12表示十二月MMM
:缩写形式的月份,例如:Jan表示一月,Dec表示十二月MMMM
:完整形式的月份,例如:January表示一月,December表示十二月
日:
DD
dd
:2位数字表示的日期,例如:01表示1号,31表示31号
星期几:
ddd
:缩写形式的星期几,例如:Mon表示星期一,Sun表示星期日dddd
:完整形式的星期几,例如:Monday表示星期一,Sunday表示星期日
时间:
HH
:24小时制的小时,例如:00表示午夜12点,23表示晚上11点hh
:12小时制的小时,例如:01表示上午1点,12表示下午12点mm
:分钟,例如:00表示整点,30表示30分钟ss
:秒,例如:00表示整分,59表示59秒a
:上午/下午标识,例如:AM表示上午,PM表示下午
表格整理:
符号 | 含义 | 示例 |
---|---|---|
G | 显示纪元文本 | AD(公元) |
u | 年份 | 2004 |
У | 公元年份 | 2004 |
D | 一年的第N天 | 189 |
M或者L | 月份 | 7;07; Jul; July; |
d | 一个月的第N目 | 10 |
Q或者q | 年份中的季度 | 3; 03; Q3; 3rd quarter |
Y | 以周为基础的年份 | 1996;96 |
w | 以周为基础的年份中的周 | 27 |
W | 一个月的第N周 | 4 |
E | 星期 | Tue; Tuesday; T |
e或者c | 本地化星期 | 2; 02; Tue; Tuesday; T |
F | 一个月的第N周 | 3 |
a | 一天中的上午(am)或者下午(pm) | PM |
h | 上午下午12小时制(1-12) | 12 |
K | 上午下午11小时制(1-11) | 0 |
k | 上午下午(1-24) | 0 |
H | 小时制(0-23) | 0 |
m | 小时中的分钟 | 30 |
s | 分秒 | 55 |
S | 当前秒的毫秒 | 978 |
A | 当前天的毫秒数 | 1234 |
n | 当前秒的纳秒数 | 987654321 |
N | 当前天的纳秒数 | 1234000000 |
V | 时区ID | America/Los_Angeles; Z; -08:30 |
z | 时区名称 | Pacific Standard Time; PST |
O | 本地化时区漂移 | GMT+8; GM T+08:00; UTC-08:00; |
X | offset-X | Z; -08; -0830; -08:30; -083015; -08:30:15; |
x | offset-x | +0000; -08; -0830; -08:30; -083015; -08:30:15; |
Z | offset-Z | +0000; -0800; -08:00; |
p | pad modifier | 1 |
' | 分隔符 | |
'' | 不被解析的文字 | |
[ | 可选部分开始 | |
] | 可选部分结束 | |
# | 保留字 | |
{ | 保留字 | |
} | 保留字 |
下面是一个示例:
String pattern = "G uuuu'年'MMMd'日' ZZZZZ VV";
String format= DateTimeFormatter.ofPattern(pattern).format(ZonedDateTime.now());
System.out.println("格式化结果 = " + format);
运行结果:
格式化结果 = 公元 2023年9月30日 +08:00 Asia/Shanghai