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
- 算法08 五大查找之:二叉排序树(BSTree)
- Struts2【UI标签、数据回显、资源国际化】
- mybatis-plus思维导图,让mybatis-plus不再难懂
- 10(01)总结形式参数,包,修饰符,内部类
- Java的参数传递是值传递还是引用传递
- 通过shell脚本来得到不稳定的执行计划(r4笔记第40天)
- Struts2【OGNL、ValueStack】
- 如何用Python爬虫实现图片自动下载?
- Hibernate【查询详解、连接池、逆向工程】
- Hibernate【缓存】知识要点
- MySQL 存储过程的简单使用
- Hibernate【与Spring整合】
- JAVA容器-自问自答学ArrayList
- 10(02)总结形式参数,包,修饰符,内部类
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- 淮师2017校园新闻爬取&&WordCloud年度词云分析
- 13 | Tornado源码分析:BaseIOStream 对象(下)
- 谈谈线程
- springboot整合定时框架-Elastic-job-lite
- hashMap的循环姿势你真的使用对了吗?
- SpringBoot整合常用技术
- SpringBoot整合Quartz实现定时任务(单任务、多任务)
- 你的登录接口,真的安全吗?如何预防黑客攻击
- JWT登录信息加密
- 我画了近百张图来理解红黑树
- SpringBoot之API--Swagger2接口文档管理
- 索引失效原理,终于有人讲明白了
- 你真了解你的系统吗?它要崩溃了
- 伸手党的容器镜像加固流程
- 前端模块化开发--React框架(四):高级应用(redux)