当前位置: 代码迷 >> 综合 >> java时间格式化----java.text.SimpleDateFormat
  详细解决方案

java时间格式化----java.text.SimpleDateFormat

热度:88   发布时间:2023-12-13 00:58:04.0

java.text.SimpleDateFormat

在java中我们一般用text包中的SimpleDateFormat来格式化时间,这个类在对时间的处理上可以算是专业选手。向上追根,SimpleDateFormat类继承于DateFormat,DateFormat继承于Format。Format提供了很多对信息,数字,日期等等内容的格式化,我们这次主要看一下SimpleDateFormat的格式化方法。另外不能忽视的是,SimpleDateFormat除了格式化,还具有解析一个String变为Date的功能。

(一) 实例化

SimpleDateFormat实例化可以用自己或者父类DateFormat。参数的选择上也有的一说,如果无参数的话就是默认的语言环境、日期格式和默认的模式来创建一个默认的格式化对象。

参数选择第一个是格式模式的String字串,第二个是语言环境,根据你的地理位置来判断,如果我们在默认不填的时候,一般默认为中文,最直接的影响就是在月份星期的时候会显示中文,为了能够得到像(Dec,Friday)这种英文的写法有必要的时候可以设置一下。

//用父类DateFormat实例化
DateFormat df = new SimpleDateFormat();
//默认环境实例化
SimpleDateFormat sdf =  new SimpleDateFormat();
//用指定的模式来实例化
String dateformat = "yyyy-MM-dd";
SimpleDateFormat sdf =  new SimpleDateFormat(dateformat);
//用指定的模式和指定的语言环境来实例化
SimpleDateFormat sdf =  new SimpleDateFormat(dateformat,Locale.US);

(二) 模式

模式就是一种你自己指定的格式,在格式化数字、信息和日期等的时候都要用到。能够格式日期的类有很多,JDK1.5之后有了个功能很强大的Formatter类能够格式几乎所有的数据。但是毕竟术业有专攻,SimpleDateFormat是专门用来格式化日期的类,SimpleDateFormat对一些地区语言的习惯书写和很复杂的东西的处理优于其他类。

日期和时间格式由日期和时间模式字符串指定。在日期和时间模式字符串中,未加引号的字母 ‘A’ 到 ‘Z’ 和 ‘a’ 到 ‘z’ 被解释为模式字母,用来表示日期或时间字符串元素。文本可以使用单引号 (‘) 引起来,以免进行解释。所有其他字符均不解释;只是在格式化时将它们简单复制到输出字符串,或者在解析时与输入字符串进行匹配。

(三) 字符对应表

上面的API中说的已经够好的了,我也就不再重新组织语言,下面先给出模式字符表:

字母 日期或时间元素 表示 示例
G Era 标志符 Text AD
y Year 1996; 96
M 年中的月份 Month July; Jul; 07
w 年中的周数 Number 27
W 月份中的周数 Number 2
D 年中的天数 Number 189
d 月份中的天数 Number 10
F 月份中的星期 Number 2
E 星期中的天数 Text Tuesday; Tue
a Am/pm 标记 Text PM
H 一天中的小时数(0-23) Number 0
k 一天中的小时数(1-24) Number 24
K am/pm 中的小时数(0-11) Number 0
h am/pm 中的小时数(1-12) Number 12
m 小时中的分钟数 Number 30
s 分钟中的秒数 Number 55
S 毫秒数 Number 978
z 时区 General time zone Pacific Standard Time; PST; GMT-08:00
Z 时区 RFC 822 time zone -0800


(四)字符表示类型

这个表没什么难度,只是告诉你对应的模式符号,唯一可能有疑惑的就在于“表示”这一列不知道是用来做什么的。实际上表示是规定了对应显示的日期的类型:

表示 特点
Text 对于格式化来说,如果模式字母的数量大于等于 4,则使用完全形式;否则,在可用的情况下使用短形式或缩写形式。比如“MM”会显示具体月份,如:“07、11”,但是“MMM”会显示“一月、Jan”,“MMMM”(三个M以上)会显示“一月,January”变成完全形式Text类型。对于解析来说,两种形式都是可接受的,与模式字母的数量无关。
Year 如果格式器的 Calendar 是默认的公历,则应用以下规则。
对于格式化来说,如果模式字母的数量为 2,则年份截取为 2 位数,否则将年份解释为 number。
(下面的内容在格式化时不会用到,看不懂可跳过)
对于解析来说,如果模式字母的数量大于 2,则年份照字面意义进行解释,而不管数位是多少。因此使用模式 “MM/dd/yyyy”,将 “01/11/12” 解析为公元 12 年 1 月 11 日。 在解析缩写年份模式时,SimpleDateFormat 必须相对于某个世纪来解释缩写的年份。这通过将日期调整为 SimpleDateFormat 实例创建之前的 80 年和之后 20 年范围内来完成。例如,在 “MM/dd/yy” 模式下,如果 SimpleDateFormat 实例是在 1997 年 1 月 1 日创建的,则字符串 “01/11/12” 将被解释为 2012 年 1 月 11 日,而字符串 “05/04/64” 将被解释为 1964 年 5 月 4 日。
在解析时,只有恰好由两位数字组成的字符串(如 Character.isDigit(char) 所定义的)被解析为默认的世纪。其他任何数字字符串将照字面意义进行解释,例如单数字字符串,3 个或更多数字组成的字符串,或者不都是数字的两位数字字符串(例如-1)。
Month 如果模式字母的数量为 3 或大于 3,则将月份解释为 text;否则解释为 number。
Number 对于格式化来说,模式字母的数量是最小的数位,如果数位不够,则用 0 填充以达到此数量。对于解析来说,模式字母的数量被忽略,除非必须分开两个相邻字段。


(五) 格式化举例

玄学的看完了上面的两张表,让我们来看一些例子,只有例子能让思路清晰:

//创建一个日历,因为SimpleDateFormat只认Date对象,所以我们把Calendar放到Date的壳子里面
Calendar cal = Calendar.getInstance();
Date dt = cal.getTime();
SimpleDateFormat sdf=null;
//将一个Date对象简单格式化为字符串
String[] datefor=new String[10];
datefor[0] = "yyyy.MMM.dd G' at' HH:mm:ss z";
datefor[1] = "EEE, MMM d, yy";
datefor[2] = "h:mm a";
datefor[3] = "hh 'o''clock' a, zzzz";
datefor[4] = "K:mm a, z";
datefor[5] = "yyyyy.MMMMM.dd GGG hh:mm aaa";
datefor[6] = "EEE, d MMM yyyy HH:mm:ss Z";
datefor[7] = "yyMMddHHmmssZ";
datefor[8] = "yyyy-MM-dd'T'HH:mm:ss.SSSZ";for(int i=0;i<9;i++){sdf= new SimpleDateFormat(datefor[i],Locale.US);System.out.println(sdf.format(dt));
}

输出结果如下:

2017.Jan.13 AD at 18:26:39 GMT+08:00
Fri, Jan 13, 17
6:26 PM
06 o’clock PM, GMT+08:00
6:26 PM, GMT+08:00
02017.January.13 AD 06:26 PM
Fri, 13 Jan 2017 18:26:39 +0800
170113182639+0800
2017-01-13T18:26:39.597+0800

(六) parse() 解析字符串

虽然我们主要看的是如何去格式化字符串,但是既然这个类有这么方便的解析方法,带着求知精神我们也一起来看一下。这个parse()函数有两个参数,第一个参数是要解析的String时间字符串,第二个参数是SimpleDateFormat中用到的一个简单的类:ParsePosition类。这个类就是指示一个字符串中解析的起点,实例化构造函数中有一个int的位置参数,设置一下就可以从这个位置开始解析。我们来看一个例子:

SimpleDateFormat sdf=new SimpleDateFormat("yyMMddHHmmssZ",Locale.US);
String datetime = "170113184012+0800";
Date returntime = sdf.parse(datetime,new ParsePosition(0));
System.out.println(returntime);

输出结果:

Fri Jan 13 18:40:12 GMT+08:00 2017

完全正确的将原来的时间解析了出来,这个函数还是很好用的。

(七) 总结

虽然上面说了很多,但是也只是一些关于格式化时间最基本的知识。一些特殊的日历的格式化和设置,还有很奥妙的方法可以从API中看到,但是那些已经过于专业化,等到需要专门根据不同地区来做时间操作的时候再去看也不迟。总的来说,SimpleDateFormat的格式化时间和解析是非常便捷和快速的。

  相关解决方案