java日期格式转换SimpleDateFormat详细介绍

SimpleDateFormat类所在java包位置:java.text.SimpleDateFormat。继承结构如下:
且实现了SerializableCloneable接口。

SimpleDateFormat类简介

SimpleDataFormat类可用于格式化、解析带区域的日期,可将日期格式转为文本,可将文本解析为日期,还可以进行日期规范化。

SimpleDataFormat类支持用户自定义日期格式,同时也提供一些内置的日期格式,例如可通过getTimeInstance、getDateInstance或DateFormat中的getDateTimeInstance获取内置日期格式。上述方法都会返回一个用默认格式的Date/Time类型对象。更多使用方法参考DateFomat类。

日期和时间的格式

日期和时间的格式可以通过String类型的格式指定,格式字母解释如下表所示:

字母日期表示类型例子
G表示纪元时代TextAD或BC
yYear199696
Y周年Year200909
M一年中的月(上下文相关)MonthJulyJul07
L一年中的月(独立形式)MonthJulyJul07
w一年中的第几周Number27
W月中的第几周Number2
D一年中的第几天Number189
d一月中的第几天Number10
F月份中的第几天Number2
E月份中的周几TextTuesdayTue
u

一周中的第几天(1=周一,...,7=周日)

Number1
aAm/pm 标记TextPM
H一天的几时 (0-23)--表示法1Number0
k一天的几时 (1-24)--表示法2Number24
Kam/pm 中的几时(0-11)Number0
ham/pm 中的几时(1-12)Number12
m小时中的分钟Number30
s分钟下的秒Number55
S毫秒Number978
z时区(指定时区,例如:PST、GMT-08:00)General time zonePacific Standard TimePSTGMT-08:00
Z时区(RFC 822日期格式)RFC 822 time zone-0800
X时区(ISO 8601标准日期格式)ISO 8601 time zone-08-0800-08:00

注:

  • 纪元AD、BC:BC(Before Christ)表示公元前(耶稣诞生之前),AD(Anno Domini)表示公元年。
  • 太平洋标准时间(PST):比世界标准时间(UTC)晚8小时,比北京时间(UT+8:00)晚16小时。加拿大、墨西哥、美国在使用。GMT为格林尼治时区时间。
  • ISO 8601全世界日期和时间相关的数据交换的国际标准。这个标准的目标是在全世界范围的通信中提供格式良好的、无歧义的时间和日期表示。

日期格式举例(地理位置为美国,时区为PST)

给定时间 2001-07-04 12:08:56,不同的日期时间格式解析的结果如下:

日期时间格式结果
"yyyy.MM.dd G 'at' HH:mm:ss z"2001.07.04 AD at 12:08:56 PDT
"EEE, MMM d, ''yy"Wed, Jul 4, '01
"h:mm a"12:08 PM
"hh 'o''clock' a, zzzz"12 o'clock PM, Pacific Daylight Time
"K:mm a, z"0:08 PM, PDT
"yyyyy.MMMMM.dd GGG hh:mm aaa"02001.July.04 AD 12:08 PM
"EEE, d MMM yyyy HH:mm:ss Z"Wed, 4 Jul 2001 12:08:56 -0700
"yyMMddHHmmssZ"010704120856-0700
"yyyy-MM-dd'T'HH:mm:ss.SSSZ"2001-07-04T12:08:56.235-0700
"yyyy-MM-dd'T'HH:mm:ss.SSSXXX"2001-07-04T12:08:56.235-07:00
"YYYY-'W'ww-u"2001-W27-3

线程安全性

该类并未加入同步操作,因此非线程安全。推荐为每个线程单独创建一个SimpleDateFormat对象,如果多线程同步访问一个SimpleDateFormat共享对象时,必须额外做好同步操作。

推荐使用线程本地解决SimpleDateFormat非线程安全问题,示例:

private static final ThreadLocal<SimpleDateFormat> sdfThreadLocal = ThreadLocal.withInitial(()->{
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        return sdf;
    });

    public static void main(String[] args){
        new Thread(()->{
            while (true){
                try{
                    Thread.sleep(1000);
                    System.out.println(Thread.currentThread().getName()+": "+sdfThreadLocal.get().format(new Date()));
                }catch (InterruptedException e){
                    e.printStackTrace();
                }
            }

        },"thread-1").start();
        new Thread(()->{
            while (true){
                try{
                    Thread.sleep(1000);
                    System.out.println(Thread.currentThread().getName()+": "+sdfThreadLocal.get().format(new Date()));
                }catch (InterruptedException e){
                    e.printStackTrace();
                }
            }

        },"thread-2").start();
    }

输出:

thread-2: 2022-05-19 20:50:23
thread-1: 2022-05-19 20:50:23
thread-1: 2022-05-19 20:50:24
thread-2: 2022-05-19 20:50:24
thread-1: 2022-05-19 20:50:25
thread-2: 2022-05-19 20:50:25
thread-1: 2022-05-19 20:50:26

方法介绍

(1)构造方法

public SimpleDateFormat()

使用默认日期格式,默认格式地理位置。注意:该方法不支持所有的地理位置,可使用DateFormat的工厂方法替代。

SimpleDateFormat(String pattern)

使用给定的patter日期格式,默认格式地理位置。注意:该方法不支持所有的地理位置,可使用DateFormat的工厂方法替代。

该方法等同于SimpleDateFormat(pattern, Locale.getDefault(Locale.Category.FORMAT)).

SimpleDateFormat(String pattern, DateFormatSymbols formatSymbols)

使用给定的pattern和日期符号。formatSymbols表示用于格式化的日期符号。

SimpleDateFormat(String pattern, Locale locale)

使用给定的日期格式,给定的默认地理位置格式。注意:该方法不支持所有的地理位置,可使用DateFormat的工厂方法替代。

最后三个构造方法存在的异常

NullPointerException - 给定pattern为空

IllegalArgumentException - 给定pattern非法

(2)常用方法

该类继承自DateFormat类,拥有后者的全部共有方法。

返回类型方法和简介
voidapplyLocalizedPattern(String pattern)

将给定的本地pattern格式应用到日期格式

voidapplyPattern(String pattern)

将给定的pattern格式应用到日期格式

Objectclone()
booleanequals(Object obj)
StringBufferformat(Date date, StringBuffer toAppendTo, FieldPosition pos)

将Date类型日期格式化为date/time类型,返回StringBuffer数据

AttributedCharacterIteratorformatToCharacterIterator(Object obj)

格式化对象返回 AttributedCharacterIterator.

Dateget2DigitYearStart()

返回100年期间的开始日期,2位数的年份被解释为起始。

DateFormatSymbolsgetDateFormatSymbols()

获取格日期、时间格式化符号

inthashCode()
Dateparse(String text, ParsePosition pos)

将text解析为Date类型数据

voidset2DigitYearStart(Date startDate)

设置从用户指定的日期开始的100年期间2位数的年份

voidsetDateFormatSymbols(DateFormatSymbols newFormatSymbols)

 设置日期和时间的格式符号

StringtoLocalizedPattern()

返回描述日期格式的本地格式字符串

StringtoPattern()

返回描述此日期格式的格式字符串。

  • 0
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值