天天看点

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

一、前言                                                                                      

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

二、 java.util.date类                         

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

三、 java.util.timezone类                        

示例1:

示例2:

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实例 的时区值。

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

2.  java.text.dateformat                             

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

  好处:方便对日期时间进行本地化。

  缺点:无法直接修改日期时间模式。

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

3.  java.util.calendar                              

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

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

   <fmt:formatdate/> 示例:

   <fmt:parsedate/> 示例:

六、再横向理解                              

  到这里大家应该可通过 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对象 

七、总结                                    

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