技术简介
java中的日期处理一直是个问题,没有很好的方式去处理,所以才有第三方框架的位置比如joda。文章主要对java日期处理的详解,用1.8可以不用joda。
时间概念
首先我们对一些基本的概念做一些介绍,其中可以将GMT和UTC表示时刻大小等同。
UT时间
UT反应了地球自转的平均速度。是通过观测星星来测量的。
UTC
UTC是用原子钟时间做参考,但保持和UT1在0.9秒内的时间,也就是说定时调整。
目前采用的时间标准是世界协调时UTC(Universal Time Coordinated)。如果计算机不联网即使再精确也是不准的,因为UTC会进行调整,而且一般走的时间也是不精确的。
NTP
现在计算机一般用的网络时间协议NTP(Network Time Protocol)是用于互联网中时间同步的标准互联网协议。用途是把计算机的时间同步到某些时间标准。
GMT(UT1)
GMT是完全符合地球自转的时间,也被称为UT1,格林尼治标准时间被用作英国的民用时间,或UTC。GMT被称为“UT1”,它直接对应于地球的自转,并受到该自转轻微不规则的影响。 正是UT1和UTC之间的差异通过应用闰秒保持>低于0.9秒。
ISO 8601
一种时间交换的国际格式。有些接口调用表示UTC/GMT时间的时候用"yyyy-MM-dd'T'HH:mm:ss'Z'"格式显示。带毫秒格式"yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"。
joda中实现如下
// Alternate ISO 8601 format without fractional seconds
private static final String ALTERNATIVE_ISO8601_DATE_FORMAT = "yyyy-MM-dd'T'HH:mm:ss'Z'";
private static DateFormat getAlternativeIso8601DateFormat() {
SimpleDateFormat df = new SimpleDateFormat(ALTERNATIVE_ISO8601_DATE_FORMAT, Locale.US);
df.setTimeZone(new SimpleTimeZone(0, "GMT"));
return df;
}
RFC 822
STANDARD FOR THE FORMAT OF ARPA INTERNET TEXT MESSAGES
其中ARPA网络其实就是互联网的前身。
有些地方会用RFC 822里的时间格式,格式如下
date-time = [ day "," ] date time ; dd mm yy
; hh:mm:ss zzz
第二个相当于现在格式
"EEE, dd MMM yyyy HH:mm:ss z"
有些头设置采用该格式。
joda中实现如下
// RFC 822 Date Format
private static final String RFC822_DATE_FORMAT = "EEE, dd MMM yyyy HH:mm:ss z";
private static DateFormat getRfc822DateFormat() {
SimpleDateFormat rfc822DateFormat =
new SimpleDateFormat(RFC822_DATE_FORMAT, Locale.US);
rfc822DateFormat.setTimeZone(new SimpleTimeZone(0, "GMT"));
return rfc822DateFormat;
}
创建SimpleDateFormat的Locale.US可以决定格式字符串某些字符的代替用哪个语言,比如EEE等。
SimpleDateFormat df1=new SimpleDateFormat("GGGG yyyy/MMMM/dd HH:mm:ss EEE aaa zzzz",Locale.CHINA);
SimpleDateFormat df2=new SimpleDateFormat("GGGG yyyy/MMMM/dd HH:mm:ss EEE aaa zzzz",Locale.US);
//公元 2016/三月/27 23:32:10 星期日 下午 中国标准时间
//AD 2016/March/27 23:32:10