热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Java8进阶手册(XX):使用简单日期对象SimpleDateFormat

目录开始使用简单日期对象SimpleDateFormat格式化日期和时间常规用法格式支持列表更改时区不是线程安全的SimpleDateFormat小结附:完整示例1

目录


  1. 开始使用简单日期对象 SimpleDateFormat
  2. 格式化日期和时间
  3. 常规用法
  4. 格式支持列表
  5. 更改时区
  6. 不是线程安全的 SimpleDateFormat
  7. 小结
  8. 附:完整示例



1.开始使用简单日期对象 SimpleDateFormat

SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");

例如,我们通常这样解析日期:

public static void main(String[] args) {//构建一个简单日起对象,并输入要解析的格式SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");Date date = null;try {//开始解析,必须捕获异常date = dateFormat.parse("2019-09-29");} catch (ParseException e) {e.printStackTrace();}System.out.println(date);
}
//打印:Sun Sep 29 00:00:00 CST 2019

2.格式化日期和时间

格式化一个日期时,可以使用方法:format()。只需要传入Date 实例中传递,就会自动生生成有格式的输出,比如:

System.out.println(dateFormat.format(new Date()));
//打印:2019-09-29

2.1 使用 String.format()

在格式化日期时,还有另一种选择:String.format()。它提供了同样简单的格式,有点类似C语言的替换字符,比如

//只显示年
String str = String.format("%1$tY", new Date());
// 打印: 2019

//完整日期
String str = String.format("%1$tY-%1$tm-%1$td", new Date());
// 打印: 2019-09-29
// 或者:
String str = String.format("%1$tF", new Date());
// 打印: 2019-09-29

//日期和时间
String str = String.format("%1$tY-%1$tm-%1$tdT%1$tH:%1$tM:%1$tS", new Date());
// 打印: 2019-09-29T15:56:09

//使用时区的日期和时间
String str = String.format("%1$tY-%1$tm-%1$tdT%1$tH:%1$tM:%1$tS%1$tz", new Date());
// 打印: 2019-09-29T15:56:09+0800

3.常规用法

Let us now look at some commonly used formats.These formats are based on ISO-8601.


3.1 只显示年

SimpleDateFormat df = new SimpleDateFormat("yyyy");
// 打印: 2019

3.2 显示年、月

SimpleDateFormat df = new SimpleDateFormat("yyyy-MM");
// 打印: 2019-09

3.3 显示年、月、日

SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
// 打印: 2019-09-29

3.4 显示日期、时间和时区

//显示到分钟数
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mmZZZZ");
// 打印: 2019-09-29T16:00+0800
//或者 加入秒数
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZZZZ");
// 打印: 2019-09-29T16:00:54+0800

3.5 显示日期、时间(秒数)和十进制分数

SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZZZZ");
// 打印: 2019-09-29T16:00:54.225+0800

3.6 显示第几周

SimpleDateFormat df = new SimpleDateFormat("yyyy-'W'ww");
// 打印: 2019-W40

3.7 显示第几周的第几天

SimpleDateFormat df = new SimpleDateFormat("yyyy-'W'ww-F");
// 打印: 2019-W40-5

3.8 显示一年的第几天

SimpleDateFormat df = new SimpleDateFormat("yyyy-DDD");
// 打印: 2019-272

3.9 显示本地时间

SimpleDateFormat df = new SimpleDateFormat("HH:mm:ss");
// 打印: 16:00:54

3.9 显示本地时间、时区

SimpleDateFormat df = new SimpleDateFormat("HH:mm:ssZZZZ");
// 打印: 16:00:54+0800

格式支持列表

日期格式,可以查看完整支持列表官方文档。


字符日期或时间组件类型标示示例
GEra designatorTextAD
yYearYear1996; 96
YWeek yearYear2009; 09
MMonth in year (context sensitive)MonthJuly; Jul; 07
LMonth in year (standalone form)MonthJuly; Jul; 07
wWeek in yearNumber27
WWeek in monthNumber2
DDay in yearNumber189
dDay in monthNumber10
FDay of week in monthNumber2
EDay name in weekTextTuesday; Tue
uDay number of week (1 = Monday, …, 7 = Sunday)Number1
aAm/pm markerTextPM
HHour in day (0-23)Number0
kHour in day (1-24)Number24
KHour in am/pm (0-11)Number0
hHour in am/pm (1-12)Number12
mMinute in hourNumber30
sSecond in minuteNumber55
SMillisecond Number978
zTime zoneGeneral time zonePacific Standard Time; PST; GMT-08:00
ZTime zoneRFC 822 time zone-0800
XTime zoneISO 8601 time zone-08; -0800; -08:00

更改时区

修改时区可以使用方法:setTimeZone()

SimpleDateFormat df = new SimpleDateFormat(..);
df.setTimeZone(TimeZone.getTimeZone("America/Los_Angeles"));

默认时区是来自 JVM 的,我们可以以编程方式更改 JVM 的时区,如下:

TimeZone.setDefault(TimeZone.getTimeZone("PST"));

或者通过指定系统属性(system property)里的用户时区选项(user.timezone.)来更改程序外的时区,比如:

java -Duser.timezone=EST ...

想要进行系统范围的更改?在 ubuntu 上,这需要更改 /etc/本地文件。执行以下操作(作为根):

// ubuntu
# dpkg-reconfigure tzdata

// centos
# tzselect

// macos
#先迁移老时区
sudo mv /etc/localtime /etc/localtime-old
#再更改时区
sudo ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

不是线程安全的 SimpleDateFormat

SimpleDateFormat 类不是线程安全的。

这意味着我们不能在多线程里使用相同的实例。有点无奈,毕竟应用程序的各个部分中经常使用相同的日期/时间格式。

此问题的一个解决方案是:使用 Apache Commons 的 FastDate 格式。此类被播发为"线程安全"和"可用作静态成员"。如果您不介意添加对 Apache Commons 的依赖关系(或者您的应用程序已经具有依赖关系),那么这就是要走的路。


小结

本文重点介绍了 SimpleDateFormat 的常规用法,在分析和格式化日期时,SimpleDate 非常有用,它提供了各种格式指令,涵盖处理日期和时间的所有方面。但是,它不是线程安全的,在并发编程下,需要考虑别的替代方案。


附:完整例子

public static void main(String[] args) {SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");Date date = null;try {date = dateFormat.parse("2019-09-29");} catch (ParseException e) {e.printStackTrace();}System.out.println(date);System.out.println(dateFormat.format(new Date()));String str = String.format("%1$tY", new Date());System.out.println(str);str = String.format("%1$tY-%1$tm-%1$td", new Date());System.out.println(str);str = String.format("%1$tF", new Date());System.out.println(str);str = String.format("%1$tY-%1$tm-%1$tdT%1$tH:%1$tM:%1$tS", new Date());System.out.println(str);str = String.format("%1$tY-%1$tm-%1$tdT%1$tH:%1$tM:%1$tS%1$tz", new Date());System.out.println(str);//SimpleDateFormat df = new SimpleDateFormat("yyyy");System.out.println(df.format(new Date()));df = new SimpleDateFormat("yyyy-MM");System.out.println(df.format(new Date()));df = new SimpleDateFormat("yyyy-MM-dd");System.out.println(df.format(new Date()));df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mmZZZZ");System.out.println(df.format(new Date()));df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZZZZ");System.out.println(df.format(new Date()));df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZZZZ");System.out.println(df.format(new Date()));df = new SimpleDateFormat("yyyy-'W'ww");System.out.println(df.format(new Date()));df = new SimpleDateFormat("yyyy-'W'ww-F");System.out.println(df.format(new Date()));df = new SimpleDateFormat("yyyy-DDD");System.out.println(df.format(new Date()));df = new SimpleDateFormat("HH:mm:ss");System.out.println(df.format(new Date()));df = new SimpleDateFormat("HH:mm:ssZZZZ");System.out.println(df.format(new Date()));}

推荐阅读
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • JavaSE笔试题-接口、抽象类、多态等问题解答
    本文解答了JavaSE笔试题中关于接口、抽象类、多态等问题。包括Math类的取整数方法、接口是否可继承、抽象类是否可实现接口、抽象类是否可继承具体类、抽象类中是否可以有静态main方法等问题。同时介绍了面向对象的特征,以及Java中实现多态的机制。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 本文介绍了Java高并发程序设计中线程安全的概念与synchronized关键字的使用。通过一个计数器的例子,演示了多线程同时对变量进行累加操作时可能出现的问题。最终值会小于预期的原因是因为两个线程同时对变量进行写入时,其中一个线程的结果会覆盖另一个线程的结果。为了解决这个问题,可以使用synchronized关键字来保证线程安全。 ... [详细]
  • Linux环境变量函数getenv、putenv、setenv和unsetenv详解
    本文详细解释了Linux中的环境变量函数getenv、putenv、setenv和unsetenv的用法和功能。通过使用这些函数,可以获取、设置和删除环境变量的值。同时给出了相应的函数原型、参数说明和返回值。通过示例代码演示了如何使用getenv函数获取环境变量的值,并打印出来。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
author-avatar
乐家巢欧美家具_636
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有