查看原文
其他

请别再使用 SimpleDateFormat 格式化时间了,DateTimeFormatter 更出色!

关注Java就该这么学带你全面认识Java
Java就该这么学后台回复 1024 有特别礼包

责编:Java就该这么学 | 来源:blog.csdn.net/Window_mouse/article/details/116356814?

上一篇精彩:面试官必问的 3 道 MQ 面试题,还有谁不会??
大家好,我是Java就该这么学。

DateTimeFormatter类

我们先来看看SImpleDateFormat类的部分源码,如图1所示。



图1

接着再来看看DateTimeFormatter类的部分源码,如 图2所示。

图2

由上可知,与SimpleDateFormat不同的是,DateTimeFormatter不但是不变对象,它还是线程安全的。线程的概念我们会在后面涉及到。另外,搜索公众号Linux就该这样学后台回复“猴子”,获取一份惊喜礼包。

现在我们只需要记住:因为SimpleDateFormat不是线程安全的,使用的时候,只能在方法内部创建新的局部变量。而DateTimeFormatter可以只创建一个实例,到处引用。

接下来,我们来说一说DateTimeFormatter类的常用方法

//创建一个格式化程序使用指定的模式
static DateTimeFormatter ofPattern(String pattern) 
  
//创建一个格式化程序使用指定的模式和现场。
static DateTimeFormatter ofPattern(String pattern, Locale locale) 
 
//使用此格式化程序格式的日期时间对象
String format(TemporalAccessor temporal) 

其中,TemporalAccessor是一个接口,其实现类有LocalDate、LocalTime、LocalDateTime、ZonedDateTime等……

牛逼啊!接私活必备的 N 个开源项目!赶快收藏吧

所以我们在使用format方法时,一般传入其实现类的实例化对象即可。

接下来我们举几个例子。

范例1:创建DateTimeFormatter

package edu.blog.test07;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

public class DateTimeFormatterTestDemo01 {
    public static void main(String[] args) {
        //自定义输出格式
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss");
        System.out.println(dtf.format(LocalDateTime.now()));
        System.out.println("===================================");
        //自定义格式解析
        LocalDateTime localDateTime = LocalDateTime.parse("2001/07/27 22:22:22", dtf);
        System.out.println(localDateTime);
    }
}

/*
结果:
2021/04/02 23:14:46
===================================
2001-07-27T22:22:22
*/

由上可知,DateTimeFormatter类格式化字符串的使用方式与SImpleDateFormat一样。

此外,另一种创建DateTimeFormatter的方法是,传入格式化字符串的同时,同时指定Locale。

范例2:按照Locale默认习惯格式化

package edu.blog.test07;

import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Locale;

public class DateTimeFormatterTestDemo02 {
    public static void main(String[] args) {
        ZonedDateTime zonedDateTime = ZonedDateTime.now();
        System.out.println(zonedDateTime);
        System.out.println("==============================");

        DateTimeFormatter formatter01 = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ZZZZ");
        System.out.println(formatter01.format(zonedDateTime));
        System.out.println("==============================");

        DateTimeFormatter formatter02 = DateTimeFormatter.ofPattern("yyyy MMM dd EE:HH:mm", Locale.CHINA);
        System.out.println(formatter02.format(zonedDateTime));
        System.out.println("==============================");

        DateTimeFormatter formatter03 = DateTimeFormatter.ofPattern("E, MMMM/dd/yyyy HH:mm", Locale.US);
        System.out.println(formatter03.format(zonedDateTime));
    }
}

/*
结果:
2021-04-02T23:27:59.326+08:00[Asia/Shanghai]
==============================
2021-04-02T23:27:GMT+08:00
==============================
2021 四月 02 星期五:23:27
==============================
Fri, April/02/2021 23:27
*/

运行本程序,分别以默认方式、中国地区和美国地区对当前时间进行显示,结果如上所述。

在格式化字符串中,如果需要输出固定字符,可以用’xxx’表示。

当我们直接调用"System.out.println()"对一个ZonedDateTime或者LocalDateTime实例进行打印的时候,实际上,调用的是它们的toString()方法,默认的toString()方法显示的字符串就是按照ISO 8601格式显示的,我们可以通过DateTimeFormatter预定义的几个静态变量来引用。

范例3:过DateTimeFormatter预定义静态变量

package edu.blog.test07;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

public class DateTimeFormatterTestDemo03 {
    public static void main(String[] args) {
        LocalDateTime localDateTime = LocalDateTime.now();
        System.out.println(localDateTime);
        System.out.println(DateTimeFormatter.ISO_DATE.format(localDateTime));
        System.out.println(DateTimeFormatter.ISO_DATE_TIME.format(localDateTime));
    }
}

/*
结果:
2021-04-02T23:38:11.707
2021-04-02
2021-04-02T23:38:11.707
*/

总结

ZonedDateTimeLocalDateTime进行格式化,需要使用DateTimeFormatter类,DateTimeFormatter可以通过格式化字符串和Locale对日期和时间进行定制输出。


欢迎有需要的同学试试,如果本文对您有帮助,也请帮忙点个 赞 + 在看 啦!❤️

在 GitHub猿 还有更多优质项目系统学习资源,欢迎分享给其他同学吧!



公众号后台回复 Java 或者 面试 有惊喜礼包!Java就该这么学交流群

 「Java就该这么学」建立了读者Java交流群,大家可以添加小编微信进行加群。欢迎有想法、乐于分享的朋友们一起交流学习。

扫描添加好友邀你进Java群,加我时注明姓名+公司+职位】


版权申明:内容来源网络,版权归原作者所有。如有侵权烦请告知,我们会立即删除并表示歉意。谢谢。

往日文章:

想了解Java后端学习路线?看完这篇就够了!
2天3夜开发了一个商城系统,用它挣了10.7万!
Java8 判空新写法!
一张图搞定Java原型模式
一款支持极速开发建站系统,让您快速搭建个性化独立网站!
这是我见过最好的监控系统!
SpringBoot 接口数据加解密实战
程序员坐牢了,会被安排写代码吗?
大公司为什么禁止SpringBoot项目使用Tomcat?
HTTP/3 发布!
SQL 优化这么做就对了!
请立即卸载这款 IDEA 插件!

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存