当前位置: 首页 > news >正文

JAVA中DateFormat详解

在Java中,`DateFormat` 是一个抽象类,它用于格式化和解析日期。`DateFormat` 允许进行日期-文本之间的转换,以及日期-时间之间的解析和格式化。Java 提供了多个 `DateFormat` 的具体子类,其中最常用的是 `SimpleDateFormat`,它允许进行自定义的日期时间格式。

DateFormat 的基本用法

`DateFormat` 类提供了以下几个重要的方法:

  • `format(Date date)`: 将 `Date` 对象格式化为 `String`。
  • `parse(String source)`: 将符合特定格式的字符串解析为 `Date` 对象。注意,这个方法可能会抛出 `ParseException`。

然而,直接使用 `DateFormat` 类并不常见,因为它是一个抽象类。在实际开发中,我们通常会使用 `SimpleDateFormat` 或者 `DateFormat` 的其他子类,如 `DateFormat.getDateInstance()`, `DateFormat.getTimeInstance()`, 和 `DateFormat.getDateTimeInstance()` 等工厂方法获取具体实例。

SimpleDateFormat 的用法

`SimpleDateFormat` 允许你通过特定的模式字符串来自定义日期时间的格式。以下是一些模式字符的示例:

  •  `y` 年
  •  `M` 月
  •  `d` 日
  •  `H` 小时 (0-23)
  •  `m` 分
  •  `s` 秒
  •  `S` 毫秒

此外,`SimpleDateFormat` 还支持文本、时区等模式字符。

示例代码

下面是一个使用 `SimpleDateFormat` 的示例,展示了如何格式化和解析日期时间。

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;public class DateFormatExample {public static void main(String[] args) {// 创建一个 SimpleDateFormat 实例,用于格式化日期SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// 创建一个 Date 对象Date date = new Date();// 使用 formatter 格式化 date 对象String formattedDate = formatter.format(date);System.out.println("Formatted date: " + formattedDate);// 尝试将格式化的字符串解析回 Date 对象try {Date parsedDate = formatter.parse(formattedDate);System.out.println("Parsed date: " + parsedDate.toString());} catch (ParseException e) {e.printStackTrace();System.out.println("Error parsing date.");}// 更改日期格式,并再次格式化formatter.applyPattern("dd/MM/yyyy HH:mm:ss");String formattedDate2 = formatter.format(date);System.out.println("Formatted date (new pattern): " + formattedDate2);// 尝试使用新的格式解析日期(注意:这通常不会成功,除非源字符串匹配新格式)try {// 注意:这里使用 formattedDate(旧格式)来解析,所以会失败Date parsedDate2 = formatter.parse(formattedDate);// 如果上面的代码没有抛出异常,则打印(但实际上它会抛出异常)System.out.println("Parsed date with new pattern (will fail): " + parsedDate2.toString());} catch (ParseException e) {System.out.println("Expected ParseException: Can't parse with new pattern.");}// 正确使用新格式解析日期try {Date parsedDate3 = formatter.parse(formattedDate2);System.out.println("Parsed date with correct new pattern: " + parsedDate3.toString());} catch (ParseException e) {e.printStackTrace();System.out.println("Error parsing date with new pattern.");}}
}

在上述代码中,我们演示了如何使用 `SimpleDateFormat` 来格式化日期为字符串,并尝试将字符串解析回 `Date` 对象。我们还展示了如何修改格式模式,并再次进行格式化和解析操作。

注意事项

  • 线程安全性:`SimpleDateFormat` 不是线程安全的。如果多个线程同时访问同一个 `SimpleDateFormat` 实例,可能会得到不可预料的结果。解决这一问题的方法是在每个线程中创建 `SimpleDateFormat` 的新实例,或者使用 `ThreadLocal` 来为每个线程存储独立的 `SimpleDateFormat` 实例。
  • 解析和格式化的性能:虽然 `SimpleDateFormat` 提供了灵活的日期时间格式化和解析功能,但在处理大量数据时,其性能可能不是最优的。在这种情况下,可能需要考虑使用其他库,如 Joda-Time 或 Java 8 引入的 `java.time` 包(即 Java 日期时间 API)。
  • 时区处理:`SimpleDateFormat` 默认使用系统时区,但你可以通过构造器中的 `TimeZone` 参数来指定时区。这对于处理跨越多个时区的日期时间数据非常重要。
     
  • 自定义格式化:除了标准的模式字符外,`SimpleDateFormat` 还允许你自定义格式化输出。例如,你可以在模式字符串中使用 `'\"'` 来引用字面值,或使用 `'\''` 来引用模式字符本身。
  • 多线程环境:在多线程环境下,最好为每个线程创建一个独立的 `SimpleDateFormat` 实例,或者使用 `ThreadLocal` 来存储它。
  • 国际化问题:`SimpleDateFormat` 的默认行为受系统默认的 `Locale` 影响。可以通过构造函数传入特定的本地化信息来改变这一行为。例如,可以使用 `new SimpleDateFormat(pattern, Locale)` 构造函数来指定一个非默认的本地化环境。
  • 遗留问题:在 Java 8 之前,`SimpleDateFormat` 是处理日期时间的主要工具之一。然而随着 Java 8 引入了新的 `java.time.*` API(JSR-310),`SimpleDateFormat` 和它的同胞们(如 `java.util.Date`, `Calendar`, 等)被认为是遗留类库的一部分。尽管这些类仍然可用,但新的应用程序被推荐使用现代化的 `java.time.*` API 进行日期时间的处理。

   
使用 Java 8 的 java.time API:如果你正在编写新的应用程序或对现有代码进行现代化改造,建议使用 Java 8 的 `java.time.*` API。这个包提供了更现代、更易于使用的类来处理日期和时间相关的任务,如 `LocalDateTime`, `ZonedDateTime`, 和其他相关类型等。它们提供了比旧类库更丰富的功能以及更好的性能表现和可读性强的 API 设计。

相关文章:

JAVA中DateFormat详解

在Java中,DateFormat 是一个抽象类,它用于格式化和解析日期。DateFormat 允许进行日期-文本之间的转换,以及日期-时间之间的解析和格式化。Java 提供了多个 DateFormat 的具体子类,其中最常用的是 SimpleDateFormat,它…...

uniapp——列表选择样式

案例 代码 <view class"list"><block v-for"(item,index) in 8" :key"index"><view class"item" click"choosePackage(item)" :class"{active:item current}"><view class"i_money&q…...

解决客户访问超时1s问题

访问公网地址返回状态码499-CSDN博客 需求描述 客户访问公司公网服务,期望在1s内完成。他们在客户端设置了超时1s的配置,如果超过1s公司服务就会报错499,这是正常的请求返回。 这里是业务简易的连路图: 分析问题 目前这个服务通过公网的alb负载均衡到ecs,通过ecs再转发…...

Linux命令(基础面试可用,都是自己觉得平时使用多的)

1.cat 参数&#xff1a;-n&#xff1a;显示行号-s&#xff1a;压缩连续的空行&#xff0c;只显示一个空行2.chattr 改变文件属性 语法&#xff1a;chattr [-RV] [/-/<属性>][文件或目录] 属性&#xff1a;a&#xff1a;让文件或目录仅供附加用途i&#xff1a;不得任意更…...

opencv-python图像增强一:传统图像去噪方法整理

一、简介&#xff1a; 在数字图像处理领域&#xff0c;噪声一直是影响图像质量的重要因素。无论是拍摄过程中的环境干扰&#xff0c;还是传输过程中的信号失真&#xff0c;噪声都可能导致图像模糊、细节丢失&#xff0c;甚至影响后续的图像分析和应用。为了提高图像的视觉效果…...

Canal单机部署

目录 一、前期准备 1、配置binlog日志 2、配置MQ服务 二、搭建canal 1、下载安装包 2、部署canal-admin的UI管理界面 2-1、创建&解压admin 2-2、配置UI管理界面 2-3、初始化元数据库 2-4、启动Canal Admin 3、部署canal-server服务 3-1、创建&解压deployer…...

java,每日练习02

题目 选自牛客网 1.下列关于Java中类的构造方法的描述&#xff0c;正确的是&#xff08;&#xff09; A.构造方法的返回类型为void B.可以定义一个类而在代码中不写构造方法。 C.在同一个类中定义的重载构造方法不可以相互调用。 D.子类不允许调用父类的构造方法。 正确答案…...

C# TreeView

添加 TreeView 控件&#xff1a;定义节点&#xff1a;添加节点&#xff1a;设置节点属性&#xff1a;处理节点事件&#xff1a;自定义节点绘制&#xff1a;数据绑定&#xff1a;节点选择&#xff1a;节点展开和折叠&#xff1a;搜索和过滤&#xff1a;示例代码总结 C# 中的 Tre…...

通过xshell使用密钥连接阿里云服务器

目录 步骤1&#xff1a;创建密钥对 步骤2&#xff1a;连接服务器 步骤3&#xff1a;连接服务器 连接阿里云服务器有几种方式&#xff0c;例如有密码进行连接&#xff0c;但是密码连接安全风险较大&#xff0c;所以我们选择密钥方式进行连接。操作简单且安全性高 步骤1&…...

<数据集>路面坑洼识别数据集<目标检测>

数据集格式&#xff1a;VOCYOLO格式 图片数量&#xff1a;681张 标注数量(xml文件个数)&#xff1a;681 标注数量(txt文件个数)&#xff1a;681 标注类别数&#xff1a;1 标注类别名称&#xff1a;[pothole] 使用标注工具&#xff1a;labelImg 标注规则&#xff1a;对类…...

几个常用脚本

系统初始化 #!/bin/bash # 定义颜色常量 RED\033[0;31m GREEN\033[0;32m NC\033[0m # No Color #功能菜单 menu() {clearecho "请选择要执行的操作:"echo "1. 检查网络"echo "2. 关闭防火墙和SELinux"echo "3. 替换YUM源"echo "…...

gtest中TEST和TEST_F和TEST_P的区别是什么

gtest&#xff08;Google Test&#xff09;是Google开发的一个开源的C测试框架&#xff0c;它提供了多种宏来支持不同类型的测试。其中&#xff0c;TEST、TEST_F和TEST_P是三个常用的宏&#xff0c;它们各自有不同的用途和特性。以下是它们之间的主要区别&#xff1a; TEST 用…...

VS2022如何调出输出窗口,并在输出窗口打印日志

在输出窗口打印 System.Diagnostics.Debug.WriteLine("这是一行自定义的输出。Debug.WriteLine");System.Diagnostics.Debug.Write("这是第二行自定义的输出&#xff0c;Debug.Write");System.Diagnostics.Debug.WriteLine("换行");System.Diagn…...

【全国大学生电子设计竞赛】2021年I题

&#x1f970;&#x1f970;全国大学生电子设计大赛学习资料专栏已开启&#xff0c;限时免费&#xff0c;速速收藏~...

【项目】基于Vue2+Router+Vant 前端面经项目

环境配置 Vue脚手架的创建 在终端中打开输入 vue create 项目包名 -m npm注意⚠️&#xff1a;项目名称不再允许包含大写字母。 选择第三项 3.选择要安装的模块 从上到下的功能模块&#xff1a; Babel - ES&#xff1a;降级处理Router-Vue&#xff1a;路由插件CSS预处理器E…...

【论文阅读】YOLOv10: Real-Time End-to-End Object Detection

题目&#xff1a;YOLOv10: Real-Time End-to-End Object Detection 作者&#xff1a;Ao Wang Hui Chen∗ Lihao Liu Kai Chen Zijia Lin Jungong Han Guiguang Ding∗ 清华大学的 motivation: 作者觉得YOLO系列的NMS和某些结构非常的耗时&#xff0c;提出NMS-free和一些列高效…...

计算资源消耗

计算资源消耗 计算资源的消耗分成&#xff1a; 模型参数本身的存储。模型参数的梯度以及梯度momentum的存储。token的传播过程 例如以llama3-7b为例&#xff1a; 模型参数存储&#xff1a; 模型参数量 * fp32 例如llama3-70b为例&#xff0c;7 * 10^9 * 4 模型参数的梯度以…...

企业微信推送消息的Java实现教程

在这篇教程中&#xff0c;我们将介绍如何使用Java实现企业微信的消息推送功能&#xff0c;特别是在完成任务后&#xff0c;将结果信息通过企业微信推送给指定的用户。我们将基于您提供的代码进行说明。 1. 环境准备 1.1 依赖库 在开始编写代码之前&#xff0c;确保您的项目中…...

强化学习之Actor-Critic算法(基于值函数和策略的结合)——以CartPole环境为例

0.简介 DQN算法作为基于值函数的方法代表&#xff0c;基于值函数的方法只学习一个价值函数。REINFORCE算法作为基于策略的方法代表&#xff0c;基于策略的方法只学习一个策略函数。Actor-Critic算法则结合了两种学习方法&#xff0c;其本质是基于策略的方法&#xff0c;因为其目…...

Linux学习记录(五)-------三类读写函数

文章目录 三种读写函数1.行缓存2.无缓存3.全缓存4.fgets和fputs5.gets和puts 三种读写函数 1.行缓存 遇到新行&#xff08;\n&#xff09;,或者写满缓存时&#xff0c;即调用系统函数 读&#xff1a;fgets,gets,printf,fprintf,sprintf写&#xff1a;fputs,puts,scanf 2.无缓…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂

蛋白质结合剂&#xff08;如抗体、抑制肽&#xff09;在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上&#xff0c;高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术&#xff0c;但这类方法普遍面临资源消耗巨大、研发周期冗长…...

Golang dig框架与GraphQL的完美结合

将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用&#xff0c;可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器&#xff0c;能够帮助开发者更好地管理复杂的依赖关系&#xff0c;而 GraphQL 则是一种用于 API 的查询语言&#xff0c;能够提…...

《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》

在注意力分散、内容高度同质化的时代&#xff0c;情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现&#xff0c;消费者对内容的“有感”程度&#xff0c;正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中&#xff0…...

用机器学习破解新能源领域的“弃风”难题

音乐发烧友深有体会&#xff0c;玩音乐的本质就是玩电网。火电声音偏暖&#xff0c;水电偏冷&#xff0c;风电偏空旷。至于太阳能发的电&#xff0c;则略显朦胧和单薄。 不知你是否有感觉&#xff0c;近两年家里的音响声音越来越冷&#xff0c;听起来越来越单薄&#xff1f; —…...

LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf

FTP 客服管理系统 实现kefu123登录&#xff0c;不允许匿名访问&#xff0c;kefu只能访问/data/kefu目录&#xff0c;不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...

LLMs 系列实操科普(1)

写在前面&#xff1a; 本期内容我们继续 Andrej Karpathy 的《How I use LLMs》讲座内容&#xff0c;原视频时长 ~130 分钟&#xff0c;以实操演示主流的一些 LLMs 的使用&#xff0c;由于涉及到实操&#xff0c;实际上并不适合以文字整理&#xff0c;但还是决定尽量整理一份笔…...

Linux部署私有文件管理系统MinIO

最近需要用到一个文件管理服务&#xff0c;但是又不想花钱&#xff0c;所以就想着自己搭建一个&#xff0c;刚好我们用的一个开源框架已经集成了MinIO&#xff0c;所以就选了这个 我这边对文件服务性能要求不是太高&#xff0c;单机版就可以 安装非常简单&#xff0c;几个命令就…...

《Offer来了:Java面试核心知识点精讲》大纲

文章目录 一、《Offer来了:Java面试核心知识点精讲》的典型大纲框架Java基础并发编程JVM原理数据库与缓存分布式架构系统设计二、《Offer来了:Java面试核心知识点精讲(原理篇)》技术文章大纲核心主题:Java基础原理与面试高频考点Java虚拟机(JVM)原理Java并发编程原理Jav…...

内窥镜检查中基于提示的息肉分割|文献速递-深度学习医疗AI最新文献

Title 题目 Prompt-based polyp segmentation during endoscopy 内窥镜检查中基于提示的息肉分割 01 文献速递介绍 以下是对这段英文内容的中文翻译&#xff1a; ### 胃肠道癌症的发病率呈上升趋势&#xff0c;且有年轻化倾向&#xff08;Bray等人&#xff0c;2018&#x…...

2025-05-08-deepseek本地化部署

title: 2025-05-08-deepseek 本地化部署 tags: 深度学习 程序开发 2025-05-08-deepseek 本地化部署 参考博客 本地部署 DeepSeek&#xff1a;小白也能轻松搞定&#xff01; 如何给本地部署的 DeepSeek 投喂数据&#xff0c;让他更懂你 [实验目的]&#xff1a;理解系统架构与原…...