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

news2024/11/26 2:55:51

一、介绍

Java 8引入了新的时间日期API,其中DateTimeFormatter是对日期时间格式化的实用类。它提供了一种简便的方法来格式化日期和时间,同时还可以将日期和时间字符串解析为Java对象。

二、特性

DateTimeFormatter具有以下特性:

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

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

3. 支持各种日期时间格式:DateTimeFormatter支持多种日期时间格式,同时还支持自定义格式。

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

三、原理

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

四、使用场景

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

2. 格式化日期和时间:使用DateTimeFormatter按指定格式将日期和时间格式化为字符串。

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

五、注意事项

1. 与SimpleDateFormat相比,DateTimeFormatter是线程安全的,可以放心地在多线程环境中使用。

2. 合理使用DateTimeFormatterBuilder类创建自定义格式,以确保应用程序满足用户的要求,并提高用户体验。

六、补充内容

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

七、实际应用

1. 案例一

(1) 场景

以下是在Java中使用DateTimeFormatter进行日期时间格式化

(2) 代码

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

/**
 * DateTimeFormatter使用案例
 *
 * @author wxy
 * @since 2023-05-29
 */
public class DateTimeFormatterCase1 {
    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);
    }
}

2. 案例二

(1) 场景

验证DateTimeFormatter是否线程安全,对比多线程下SimpleDateFormat和DateTimeFormatter区别。

(2) 代码

import java.text.SimpleDateFormat;
import java.time.format.DateTimeFormatter;
import java.util.Date;
import java.util.concurrent.TimeUnit;

/**
 * DataTimeFormatterCase2: 对比多线程下SimpleDateFormat和DateTimeFormatter区别
 *
 * @author wxy
 * @since 2023-05-29
 */
public class DataTimeFormatterCase2 {
    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:多线程下,使用SimpleDateFormat报错(线程不安全):

主要是因为SimpleDateFormat在多线程环境下,是线程不安全的,所以如果你在多线程环境中共享了SimpleDateFormat的实例。

输出结果2:多线程下使用DateTimeFormatter,无报错(线程安全):

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1162588.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vue-cli5.0.x优雅降级,配置项目兼容旧版浏览器

兼容低版本谷歌浏览器 vue-cli5.0.x脚手架下的&#xff0c;如何降低项目版本以适用于底版本的浏览器。 直接使用默认配置打包部署出来的项目再40&#xff0c;60、70版本的谷歌浏览器跑不起来&#xff0c;蓝屏或者浏览器白屏一般这种情况都需要通过Babel去做转换&#xff0c;我…

uniapp原生插件之安卓USB摄像头插件

插件介绍 安卓USB摄像头&#xff0c;支持拍照&#xff0c;录像&#xff0c;停止预览&#xff0c;开启预览&#xff0c;支持多摄像头切换 插件仅支持nvue页面 插件地址 安卓USB摄像头插件 - DCloud 插件市场 超级福利 uniapp 插件购买超级福利 详细使用文档地址 uniapp 安…

STM32H750之FreeRTOS学习--------(四)中断管理

四、FreeRTOS中断管理 中断的概念不再过多叙述&#xff0c;学习过逻辑的都知道 中断的执行过程 中断请求 外设产生中断请求&#xff08;GPIO外部中断、定时器中断等&#xff09;响应中断 CPU停止执行当前程序&#xff0c;转而去执行中断处理程序&#xff08;ISR&#xff09;…

SecureCRT 发送文件内容

当需要连接 Linux 服务器或设备的时候&#xff0c;SecureCRT 是一个利器。有一个工作场景是这样的&#xff0c;工程代码在服务器上编译完后运行&#xff0c;然后用 secureCRT 连接程序的指定端口&#xff08;用 telnet &#xff09;&#xff0c;连接上后就往端口里下发配置&…

在美团和阿里6年,很难却也真实...

先简单的说下&#xff0c;本人6年工作经验&#xff0c;曾就职于某大型国企&#xff0c;公司研究院成员&#xff0c;也就职过美团担任高级测试开发工程师&#xff0c;有丰富的高并发大型项目经验。 后端高并发、高性能、高可用性开发&#xff0c;自动化测试框架开发以及软件自动…

@机械装备企业,“专精特新”你需要这样做!

目录 生产过程有4个特点 三大管理难点 01 计划难管控 02 生产难协同 03 现场难管控 机械装备数字化建设怎么做&#xff1f; 01 计划管控 02 生产协同 03 现场数字化 从2021年7月至今&#xff0c;“专精特新”热度一直居高不下&#xff0c;但其实&#xff0c;这一词早在…

大数据可视化分析建模:每个人都是数据分析师

&#x1f482; 个人网站:【工具大全】【游戏大全】【神级源码资源网】&#x1f91f; 前端学习课程&#xff1a;&#x1f449;【28个案例趣学前端】【400个JS面试题】&#x1f485; 寻找学习交流、摸鱼划水的小伙伴&#xff0c;请点击【摸鱼学习交流群】 第一部分&#xff1a;介…

【嵌入式项目应用】__cJSON基础介绍与代码测试

目录 前言 一、JSON是什么&#xff1f; 1. JSON 基本语法 2. JSON值(value)的类型 3. 逻辑值&#xff08;true 或 false&#xff09; 4. null 5. NUMBER 数字&#xff08;整数或浮点数&#xff09; 6. STRING 字符串&#xff08;在双引号""中&#xff09; 7…

ChatGLM3-6B详细安装过程记录(Linux)

先附上GitHub官方地址: https://github.com/THUDM/ChatGLM3https://github.com/THUDM/ChatGLM3 一、预览 咱们可以先看看完成之后的界面: 1. 基于 Gradio 的网页版 demo 运行以下命令即可打开界面: python web_demo.py 运行界面如下: 2. 基于 Streamlit 的网页版 de…

【23真题】难!均79分!211题目强过985!

今天分享的是23年海南大学838的信号与系统试题及解析。 本套试卷难度分析&#xff1a;22年海南大学838考研真题&#xff0c;我也做过&#xff0c;若有需要戳这里自取&#xff01;平均分为80-90左右&#xff0c;最高分为133分。本套试题难度中等偏上&#xff0c;题量不多&#…

Python画图之草莓熊

Python-turtle画出草莓熊&#xff08;有趣小游戏&#xff09; 一、效果图二、Python代码 一、效果图 二、Python代码 # -*- coding: UTF-8 -*- import turtle as t# 设置背景颜色&#xff0c;窗口位置以及大小 t.colormode(255) # 颜色模式 t.speed(0) t.screensize(850, 760…

通过Python脚本支持OC代码重构实践(二):数据项提供模块接入数据通路的代码生成

作者 | 刘俊启 导读 在软件开发中&#xff0c;经常会遇到一些代码问题&#xff0c;例如逻辑结构复杂、依赖关系混乱、代码冗余、不易读懂的命名等。这些问题可能导致代码的可维护性下降&#xff0c;增加维护成本&#xff0c;同时也会影响到开发效率。这时通常通过重构的方式对已…

STM32智能小车(循迹、跟随、避障、测速、蓝牙、wife、4g、语音识别)总结

目录 1.电机模块开发 1.1 让小车动起来 1.2 串口控制小车方向 1.3 如何进行小车PWM调速 1.4 PWM方式实现小车转向 2.循迹小车 2.1 循迹模块使用 2.2 循迹小车原理 2.3 循迹小车核心代码 2.4 循迹小车解决转弯平滑问题 3.跟随/避障小车 3.1 红外壁障模块分析​编辑 …

Redis 应用问题

1-缓存穿透 1.1-问题描述 Key 对应的数据在数据源并不存在&#xff0c;每次针对此 Key 的请求从缓存获取不到&#xff0c;请求都会压到数据源&#xff0c;从而可能压垮数据源。 比如&#xff1a;用一个不存在的用户ID 获取用户信息&#xff0c;不论缓存还是数据库都没有&…

有哪些适合做小说推文的配音软件?

其实现在市面上的短视频配音软件数不胜数&#xff0c;怎样才能挑选到简单又实用的呢&#xff1f;今天我就来给你盘一盘各大配音软件的优缺点&#xff0c;大家可以根据自己的需求来选择合适的配音软件&#xff01; 一、悦音配音 推荐指数★★★★★ 推荐理由&#xff1a;无需自…

SpringBoot SerializationUtils克隆(反序列化) 类加载器不一致问题(ClassCastException)

问题分析 在SpringBoot中使用 org.apache.commons.lang.SerializationUtils.clone 方法时&#xff0c;发现克隆出来的类强转对应类时发生类型不一致的错误&#xff0c;经过检测发现两个看似相同的类的类加载器不一致 场景 报错信息 java.lang.ClassCastException: com.tianq…

伦敦金投资怎么玩收益高?

伦敦金&#xff0c;作为国际黄金市场的代表&#xff0c;一直备受投资者的关注。它有着高流动性和丰富的投资机会&#xff0c;但要真正玩得收益高&#xff0c;就需要掌握一些关键的方法和技巧。在本文中&#xff0c;万洲金业将为您提供专业建议&#xff0c;告诉您伦敦金投资怎么…