当前位置: 首页 > 图灵资讯 > 技术篇> 掌握DateTimeFormatter,让你的时间格式化更简单

掌握DateTimeFormatter,让你的时间格式化更简单

来源:图灵教育
时间:2023-06-11 09:09:50

 

一、介绍

Java 8引入了新的时间日期API,其中Datetimeformater是日期时间格式化的实用类别。它提供了一种简单的格式化日期和时间的方法,并将日期和时间字符串分析为Java对象。

二、特性

Datetimeformatter具有以下特点:

1. 线程安全:在多线程应用程序中使用DatetimeFormater时,无需考虑同步问题。

2. 不可变性:DatetimeFormater对象创建后不可修改,确保线程安全。

3. 支持各种日期时间格式:DatetimeFormatter支持多种日期时间格式和自定义格式。

4. 可扩展性:可以用DatetimeFormaterbuilder创建自定义格式。

三、原理

基于模式的方法对日期和时间字符串进行格式化。它使用预定义的格式指令来识别和象征日期和时间字段。这些指令可以组合在一起,形成各种预期的格式日期和时间字符串。

四、使用场景

DatetimeFormatter可应用于以下场景:

1. 日期和时间字符串转换为Java对象:使用DatetimeFormater将字符串分析为日期时间对象。

2. 格式化日期和时间:使用Datetimeformatter将日期和时间格式化为字符串。

3. 多语言支持:根据不同的语言环境,使用不同的DatetimeFormater格式化日期时间。

五、注意事项

1. 与Simpledateformat相比,Datetimeformater线程安全,可在多线程环境中安全使用。

2. 合理利用datetimeformaterbuilder创建自定义格式,确保应用程序满足用户需求,提高用户体验。

六、补充内容

DatetimeFormatter除了基本的日期、时间、时间等格式化选项外,还提供了一些额外的功能,如本地化、ISO格式日期时间格式、精度控制等。

七、实际应用

1. 案例一

(1) 场景

以下是Java中DatetimeFormater的日期格式

(2) 代码

 

import java.time.LocalDate;import java.time.LocalDateTime;import java.time.format.DateTimeFormatter;/** * Datetimeformater使用案例 * * @author wxy * @since 2023-05-29 */public class Datetimeformatercase {    private static final DateTimeFormatter SECOND_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");    private static final DateTimeFormatter DAY_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd");    public static void main(String[] args) {        // 获取当前的日期和时间        LocalDateTime nowDateTime = LocalDateTime.now();        System.out.println(”格式化前(LocalDateTime): " + nowDateTime);        System.out.println(格式化后(String): " + nowDateTime.format(SECOND_FORMATTER));        // 分析字符串为日期        String dateStr = "1990-01-01";        LocalDate dateTime = LocalDate.parse(dateStr, DAY_FORMATTER);        System.out.println("转换前(String): " + dateStr);        System.out.println("转换后(LocalDate): " + dateTime);    }}

 

掌握DateTimeFormatter,让你的时间格式化更简单_java

2. 案例二

(1) 场景

验证与Simpledateformater多线程下的Simpledateformat和Dateteformater的区别相比,Dateteformater是否安全。

(2) 代码

 

import java.text.SimpleDateFormat;import java.time.format.DateTimeFormatter;import java.util.Date;import java.util.concurrent.TimeUnit;/** * Datatimeformatercase: 比较Simpledateformat和Dateteformater的区别 * * @author wxy * @since 2023-05-29 */public class Datatimeformatercase {    private static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");    private static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");    public static void main(String[] args) throws InterruptedException {        for (int i = 0; i < 2; i++) {            new Thread(() -> {                for (int j = 0; j < 3; j++) {                    try {                        // 休眠100ms                        TimeUnit.MILLISECONDS.sleep(100);                    } catch (InterruptedException e) {                        e.printStackTrace();                    }                    try {                        /// 使用Datetimeformatter将字符串转换为日期格式                        //LocalDate dateTime = LocalDate.parse("2022-01-01 10:00:00", DATE_TIME_FORMATTER);                        /// 使用Simpledateformat将字符串转换为日期格式(多线程报错: java.lang.NumberFormatException: multiple points)                        Date dateTime = DATE_FORMAT.parse("2022-01-01 10:00:00");                        System.out.println(转换后: " + dateTime);                    } catch (Exception e) {                        e.printStackTrace();                    }                }            }).start();        }        // 休眠1000ms        TimeUnit.MILLISECONDS.sleep(1000);    }}

 

输出结果1:SimpledateFormattte报错(线程不安全)

掌握DateTimeFormatter,让你的时间格式化更简单_java_02

主要是因为Simpledateformat在多线程环境下是不安全的,所以如果你在多线程环境中分享Simpledateformat的例子。

输出结果2:DatetimeFormatter用于多线程,无报错(线程安全)