Skip to content

DateTime

Calvin edited this page Nov 13, 2013 · 6 revisions

##1. Joda Time

Joda Time 在很久以前就被认为应该直接收入JDK,因为它吸取了JDK里Date的大量失败教训,如对象应该是不可改的,对字符串与Date类型的转换,时区/Locale的支持,各种日期计算的简便函数等等都不错。

###1.1 Joda演示 Joda Time的详细使用见Showcase中的JodaDemo。

###1.2 Joda在各种环境中的使用 ####1.2.1 在Hibernate中使用DateTime类型 在quickstart的User对象中的registerDate属性就直接使用了Joda Time类型。Hibernate4.0需要引入UserType项目。在属性上做出如下标注

@Type(type = "org.jadira.usertype.dateandtime.joda.PersistentDateTime")
public DateTime getRegisterDate()

class名有点长,后来又引入了一个Hibernates.DATETIME_TYPE变量.
userType中还有其他类型,比如专门对应java.sql.Date与java.sql.Time的. 在JDK 1.6里,会显示一条”Under JDK 6 it may not be possible to handle DST transitions correctly wiki it“的信息,忽略它。

####1.2.2 在JSP中显示DateTime类型 在quickstart的管理员管理用户时演示。需要引入joda-jsptags,不能再用<fmt>。

演示格式可以直接用pattern(如yyyy-MM-dd)设定,也可以设置style和locale,在Showcase的JodaDemo中都有演示。quickstart中用了style风格

<%@ taglib prefix="joda" uri="http://www.joda.org/joda/time/tags" %>
<joda:format value="${user.registerDate}" style="LL" locale="zh"/>

####1.2.3 Jackson中的转换 Jackson有个jackson-datatype-joda的子项目,但只能转换成Timestamp,不能像Date那样在属性中定义日期格式,非常遗憾。

##2. 关于时间的测试 如果代码中需要当前时间的时候,直接使用dateTime= new DateTime()这样的语法,对测试的assert语句编写及超时判断,时间间隔计算等等都很不方便。像SPring Data JPA就封装了一个DateTimeProvider的抽象,默认提供直接使用系统时间,测试时可以自由控制。既然他已经写好了,SpringSide就直接使用,在springside-test中封装了一个MockDateTimeProvider.

在Quickstart的AccountService及AccountServiceTest对registerDate的处理,演示了这种DateTimeProvider的使用。

##3. 各种数据库的时间存储。 ###3.1 H2 支持TimeStamp类型,以UTC存储数据,比如如下语句插入的sql, 在界面上显示的时间将是早上9点

insert into SS_USER (ID, REGISTER_DATE) values(1,'2012-06-04 01:00:00');

###3.2 MySQL MySQL的TimeStamp有个毛病,一旦设置不对,就会帮你时时把值更新到当前日期。安全的设置语句如下

ISSUED_TIME TIMESTAMP DEFAULT 0,

4. date in JSP

<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<fmt:formatDate value="${user.registerDate}" pattern="yyyy年MM月dd日  HH时mm分ss秒" />