Java魔法堂:Date与日期时间格式化

一、前言                                                                                      

    日期时间的获取、显示是每个程序都会涉及到的,下面是一些记录以便日后查阅。

二、 java.util.Date类

// 当前日期时间
Date now = new Date();
/* 由于程序的默认时区不同,可能显示如下内容:
 * 1. 格林尼治时间,Tue Oct 28 01:24:14 GMT 2014
 * 2. 美国中部标准时间,Tue Oct 27 23:24:14 GST 2014
 */
System.out.println(now);

从上面的示例可以知道除了 java.util.Date类 外我们还要了解时区 java.util.TimeZone 这个类才能得到需要的日期信息。

三、 java.util.TimeZone类

示例1:

// 获取默认时区(最初始时由JVM决定的)
TimeZone defaultTZ = TimeZone.getDefault();
// 显示sun.util.calendar.ZoneInfo[id="GMT",offset=0,dstSavings=0,useDaylight=false,transitions=0,lastRule=null]
System.out.println(defaultTZ);

示例2:

// 设置东八区为当前时区
TimeZone e8 = TimeZone.getTimeZone("GMT+8");
TimeZone.setDefault(e8);
// 显示sun.util.calendar.ZoneInfo[id="GMT+08:00",offset=28800000,dstSavings=0,useDaylight=false,transitions=0,lastRule=null]
System.out.println(TimeZone.getDefault())

TimeZone.getTimeZone() 的入参为时区ID,可以通过 TimeZone.getAvaliableIDs() 可获取可用的时区ID。 

好了,现在我们有了日期时间源数据就可以着手格式化了。

四、 Java代码中的日期时间格式化                  

1.  java.text.SimpleDateFormat extends java.text.DateFormat

  作用:通过实例的 format() 方法将日期对象( java.util.Date )格式化为文本,通过 parse() 方法将文本解析为日期对象( java.util.Date )

  注意:在通过 SimpleDateFormat sdf = new SimpleDateFormat() 实例化时,会以当前的默认时区作为后续格式化、解析操作的时区,即使后续代码中重新设置默认时区也不会影响 SimpleDateFormat实例 的时区值。

// 初始化时设置 日期和时间模式
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss.SSS");

// 修改日期和时间模式
sdf.applyPattern("yyyy/MM/dd HH:mm:ss.SSS")

sdf.format(new Date());

查看源码会发现其实 java.text.SimpleDateFormat 内部使用了 java.util.Calendar 来获取 java.util.Date实例 的时分秒等部分,并进行格式化处理。

2.  java.text.DateFormat

  作用:内置了多种与特定的 DateFormatSymbols对象 绑定的formatter对象(也就是预设了日期时间模式)。

  好处:方便对日期时间进行本地化。   缺点:无法直接修改日期时间模式。

  其内部是使用 java.text.SimpleDateFormat 来处理格式化的

3.  java.util.Calendar

  作用:用于萃取日期时间中的年、月、日、时、分、秒等信息,至于格式化就有我们自己解决了。它有一个好处就是在初始Calendar实例时可以设置使用的TimeZone。

Date date = new Date();
Calendar c1 = Calendar.getInstance(TimeZone.getTimeZone("GMT+8"));
c1.set(date);
cl.get(Calendar.YEAR);
cl.get(Calendar.MONTH);
cl.get(Calendar.DATE);

五、JSTL中的日期时间格式化                      

<fmt:formatDate/> 示例:

<%
  Date now = new Date();
%>
<%-- 使用自定义日期时间模式来格式化 --%>
<fmt:formatDate value="${now}" timeZone="GMT+8" type="date" pattern="MM-dd"/>

<%-- 采用内置的日期时间模式来格式化 --%>
<fmt:formatDate value="${now}" timeZone="GMT+8" dateStyle="short"/

<fmt:parseDate/> 示例:

<%-- 结果输出到JspWriter中 --%>
<fmt:parseDate value="2005/12/21" pattern="yyyy/MM/dd"/

六、再横向理解                              

  到这里大家应该可通过 SimpleDateFormat实例 来格式化日期时间了,但总觉得 java.text.DateFormat 不好理解。下面介绍的 java.util.Locale 和 java.text.DateFormatSymbols 应该可以帮助大家更好去理解。

  1. java.util.Locale

     作为标识来代表特定地理位置、政治、文化区域。当某操作需要与特定的地理位置、政治、文化区域关联时,我们称其为locale-sensitive。(如处理货币、日期)<Br/> `Locale`由“语言码(language code)”和“地区码(country code)”、“补充码(variant 入参)”组成,其中“地区码(country code)”和“补充码(variant 入参)”为可选。

语言码(language code),由两个小写字母组成,如zh, en。命名规范:http://www.loc.gov/standards/iso639-2/englangn.html  地区码(country code),由两个大写字母组成,如CN,US。命名规范:http://www.iso.ch/iso/en/prods-services/iso3166ma/02iso-3166-code-lists/list-en1.html  补充码(variant 入参),由于是规范之外的选项,因此没有严格的格式规定,只规定多个值时,通过下划线(_)连接各值即可。  各类型的码采用下滑线(_)连接构成完整的Locale。  Locale示例(“语言码(language code)”+“地区码(country code)”): zh_CN 。  可以自定义Locale对象,也可直接使用`java.util.Locale`内置的Locale对象。、

  2. java.text.DateFormatSymbols

   封装了根据Locale对象来对日期时间本地化资源的操作。一般不直接使用该类,而是通过 DateFormat.getDateInstance() 等方法来获取内置的formatter对象,该formatter对象已经绑定特定的 DateFormatSymbols对象

七、总结                                    

  上述内容只是引子,结合练习和源码才能有所深入哦!

八、参考                                    

http://blog.csdn.net/sz_bdqn/article/details/2847589

http://blog.sina.com.cn/s/blog_6d818993010156zn.html

http://www.wanho.net/java/javanews/314.html

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Linyb极客之路

编码习惯之参数校验和国际化规范

今天我们说说参数校验和国际化,这些代码没有什么技术含量,却大量充斥在业务代码上,很可能业务代码只有几行,参数校验代码却有十几行,非常影响代码阅读,所以很有必要把...

32760
来自专栏mathor

LeetCode216. 组合总和 III

 简单的dfs问题,标记每一个数用没用过,没用过就用,v[i]=true,k--,n-=i,然后回溯就只需要将他们还原就行,注意这里是不能重复选,因此下一...

7620
来自专栏计算机视觉与深度学习基础

Leetcode 140 Word Break II

Given a string s and a dictionary of words dict, add spaces in s to construct a...

192100
来自专栏武培轩的专栏

猫眼面经汇总

java.util.Collections 是一个包装类(工具类/帮助类)。它包含有各种有关集合操作的静态多态方法。此类不能实例化,就像一个工具类,用于对集合中...

19430
来自专栏Java进阶之路

高并发情景下避免使用SimpleDateFormat

20700
来自专栏计算机视觉与深度学习基础

Leetcode 274. H-Index

Given an array of citations (each citation is a non-negative integer) of a rese...

22480
来自专栏公众号_薛勤的博客

Jsoup模拟登录带验证码的教务系统(原理详解)

在模拟登陆该教务系统时,笔者观察到该教务系统还有一个不需要验证码即可登陆的网址:http://jwxt.qlu.edu.cn/jsxsd/xsxk/xklc_l...

19220
来自专栏Android 研究

OKHttp源码解析(七)--中阶之缓存机制

Entry内部类是实际用于存储的缓存数据的实体类,每一个url对应一个Entry实体

24260
来自专栏Samego技术资源分享

数据库Dao层抽象出BasicDao类 | 许久没碰Java了、致Java初学者

19240
来自专栏IT杂记

DateFormat 线程不安全

一、测试 测试代码如下:  private static SimpleDateFormat sdf = new SimpleDateFormat("yy...

21950

扫码关注云+社区

领取腾讯云代金券