⽇期操作类(DateFormat与SimpleDateFormat)的区别和使
⽤详解
⼀、DateFormat类
此类是⼀个⽇期的格式化类,⽤来格式化⽇期。具体⽇期可以通过java.util.Date类来获取。
DateFormat类的定义:此类是定义在st包中的。
public abstract class DateFormat extends Format
1
1.1、实例化DateFormat
DateFormat是⼀个抽象类,按照以住的思路,直接使⽤其⼦类实例化即可。但是DateFormat 类本⾝的内部提供了可以直接为其实例化的操作。
//得到⽇期的DateFormat对象:
public static final DateFormat getDateInstance();
//得到⽇期时间的DateFormat对象:
public static final DateFormat getDateTimeInstance();
//使⽤DateFormat类格式化Date类⽇期
public final String format(Date date)
1.2、⽇期格式
美式⽇期格式
DateFormat ;
import java.util.Date ;
public class DateDemo03{
public static void main(String args[]){
DateFormat df1 = null ; // 声明⼀个DateFormat
DateFormat df2 = null ; // 声明⼀个DateFormat
df1 = DateInstance() ; // 得到⽇期的DateFormat对象
df2 = DateTimeInstance() ; // 得到⽇期时间的DateFormat对象
System.out.println("DATE:" + df1.format(new Date())) ; // 按照⽇期格式化
System.out.println("DATETIME:" + df2.format(new Date())) ; // 按照⽇期时间格式化
}
};
中式⽇期格式(通过Locale对象指定要显⽰的区域,指定的区域是中国)
DateFormat ;
import java.util.Date ;
import java.util.Locale ;
public class DateDemo04{
public static void main(String args[]){
DateFormat df1 = null ; // 声明⼀个DateFormat
DateFormat df2 = null ; // 声明⼀个DateFormat
df1 = DateInstance(DateFormat.YEAR_FIELD,new Locale("zh","CN")) ; // 得到⽇期的DateFormat对象
df2 = DateTimeInstance(DateFormat.YEAR_FIELD,DateFormat.ERA_FIELD,new Locale("zh","CN")) ; // 得到⽇期时间的DateForma System.out.println("DATE:" + df1.format(new Date())) ; // 按照⽇期格式化
System.out.println("DATETIME:" + df2.format(new Date())) ; // 按照⽇期时间格式化
抽象类的使用}
};
⼆、SimpleDateFormat类
SimpleDateFormat函数的继承关系:
java.lang.Object
|
+—-Format
|
+—-DateFormat
|
+—-SimpleDateFormat
将⼀种⽇期格式变为另外⼀种⽇期格式
原始⽇期:2008-10-19 10:11:30.345
转换后⽇期:2008 年 10 ⽉ 19 ⽇ 10 点 11 分 30 秒 345 毫秒
期模板
⾸先准备好⼀个⽇期格式模板,根据模板的格式来转化⽇期。
2.2、SimpleDateFormat类使⽤
在构造对象时要传⼊⽇期格式模板
//构造⽅法:
public SimpleDateFormat(String pattern)
//转换:
public Date parse(String source)throws ParseException //-->此时取得的是全部时间数。
//格式化:
public final String Format(Date date) //-->将时间重新格式化成字符串显⽰。
2.3、⽰例
把Date转化成指定的⽇期格式
public class FormatDateTime {
public static void main(String[] args) {
SimpleDateFormat myFmt=new SimpleDateFormat("yyyy年MM⽉dd⽇ HH时mm分ss秒");
SimpleDateFormat myFmt1=new SimpleDateFormat("yy/MM/dd HH:mm");
SimpleDateFormat myFmt2=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//等价于LocaleString() SimpleDateFormat myFmt3=new SimpleDateFormat("yyyy年MM⽉dd⽇ HH时mm分ss秒 E ");
SimpleDateFormat myFmt4=new SimpleDateFormat(
"⼀年中的第 D 天⼀年中第w个星期⼀⽉中第W个星期在⼀天中k时 z时区");
Date now=new Date();
System.out.println(myFmt.format(now));
System.out.println(myFmt1.format(now));
System.out.println(myFmt2.format(now));
System.out.println(myFmt3.format(now));
System.out.println(myFmt4.format(now));
System.out.GMTString());
System.out.LocaleString());
System.out.String());
}
效果:
2004年12⽉16⽇ 17时24分27秒
04/12/16 17:24
2004-12-16 17:24:27
2004年12⽉16⽇ 17时24分27秒 星期四
⼀年中的第 351 天 ⼀年中第51个星期 ⼀⽉中第3个星期 在⼀天中17时 CST时区
16 Dec 2004 09:24:27 GMT
2004-12-16 17:24:27
Thu Dec 16 17:24:27 CST 2004
把给定的字符串中的⽇期提取为Date
这样做,通常是⼀个⽇期字符串,但不是想要的格式,可以先转化为Date,再转化为其它格式。
* ;
import java.util.* ;
public class DateDemo05{
public static void main(String args[]){
String strDate = "2008-10-19 10:11:30.345" ;
// 准备第⼀个模板,从字符串中提取出⽇期数字
String pat1 = "yyyy-MM-dd HH:mm:ss.SSS" ;
// 准备第⼆个模板,将提取后的⽇期数字变为指定的格式
String pat2 = "yyyy年MM⽉dd⽇ HH时mm分ss秒SSS毫秒" ;
SimpleDateFormat sdf1 = new SimpleDateFormat(pat1) ; // 实例化模板对象
SimpleDateFormat sdf2 = new SimpleDateFormat(pat2) ; // 实例化模板对象
Date d = null ;
try{
d = sdf1.parse(strDate) ; // 将给定的字符串中的⽇期提取出来
}catch(Exception e){ // 如果提供的字符串格式有错误,则进⾏异常处理
e.printStackTrace() ; // 打印异常信息
}
System.out.println(sdf2.format(d)) ; // 将⽇期变为新的格式
}
};
DateFormat 和SimpleDateFormat 的区别
1.DateFormat 可以直接使⽤,但其本⾝是⼀个抽象类,可以根据Locate指定的区域得到对应的⽇期时间格式
2.SimpleDateFormat 类是DateFormat 类的⼦类,⼀般情况下来讲 DateFormat 类很少会直接使⽤。⽽都使⽤SimpleDateFormat 类完成。
⽇期和时间模式
⽇期和时间格式由⽇期和时间模式 字符串指定。在⽇期和时间模式字符串中,未加引号的字母 'A' 到 'Z' 和 'a' 到 'z' 被解释为模式字母,⽤来表⽰⽇期或时间字符串元素。⽂本可以使⽤单引号 (') 引起来,以免进⾏解释。"''" 表⽰单引号。所有其他字符均不解释;只是在格式化时将它们简单复制到输出字符串,或者在解析时与输⼊字符串进⾏匹配。
定义了以下模式字母(所有其他字符 'A' 到 'Z' 和 'a' 到 'z' 都被保留):
字母⽇期或时间元素表⽰⽰例
G Era 标志符Text AD
y年Year1996; 96
M年中的⽉份Month July; Jul; 07
w年中的周数Number27
W⽉份中的周数Number2
D年中的天数Number189
d⽉份中的天数Number10
F⽉份中的星期Number2
E星期中的天数Text Tuesday; Tue
a Am/pm 标记Text PM
H⼀天中的⼩时数(0-23)Number0
k⼀天中的⼩时数(1-24)Number24
K am/pm 中的⼩时数(0-11)Number0
h am/pm 中的⼩时数(1-12)Number12
m⼩时中的分钟数Number30
s分钟中的秒数Number55
S毫秒数Number978
z时区General time zone Pacific Standard Time; PST; GMT-08:00
Z时区RFC 822 time zone-0800
模式字母通常是重复的,其数量确定其精确表⽰:
Text: 对于格式化来说,如果模式字母的数量⼤于等于 4,则使⽤完全形式;否则,在可⽤的情况下使⽤短形式或缩写形式。对于解析来说,两种形式都是可接受的,与模式字母的数量⽆关。
Number: 对于格式化来说,模式字母的数量是最⼩的数位,如果数位不够,则⽤ 0 填充以达到此数量。对于解析来说,模式字母的数量被忽略,除⾮必须分开两个相邻字段。
Year: 如果格式器的 Calendar 是格⾥⾼利历,则应⽤以下规则。
Month: 如果模式字母的数量为 3 或⼤于 3,则将⽉份解释为 text;否则解释为 number。
对于格式化来说,如果模式字母的数量为 2,则年份截取为 2 位数,否则将年份解释为 number。
对于解析来说,如果模式字母的数量⼤于 2,则年份照字⾯意义进⾏解释,⽽不管数位是多少。因此使⽤模式 "MM/dd/yyyy",将"01/11/12" 解析为公元 12 年 1 ⽉ 11 ⽇。
在解析缩写年份模式("y" 或 "yy")时,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")。因此,在相同的模式下, "01/02/3" 或 "01/02/003" 解释为公元 3 年 1 ⽉ 2 ⽇。同样,"01/02/-3" 解析为公元前 4 年 1 ⽉ 2 ⽇。
否则,则应⽤⽇历系统特定的形式。对于格式化和解析,如果模式字母的数量为 4 或⼤于 4,则使⽤⽇历特定的 long form。否则,则使⽤⽇历特定的 short or abbreviated form。
SimpleDateFormat 还⽀持本地化⽇期和时间模式 字符串。在这些字符串中,以上所述的模式字母可以⽤其他与语⾔环境有关的模式字母来替换。SimpleDateFormat 不处理除模式字母之外的⽂本本地化;⽽由类的客户端来处理。
⽰例
以下⽰例显⽰了如何在美国语⾔环境中解释⽇期和时间模式。给定的⽇期和时间为美国太平洋时区的本地时间 2001-07-04 12:08:56。
⽇期和时间模式结果
"yyyy.MM.dd G 'at' HH:mm:ss z"2001.07.04 AD at 12:08:56 PDT
"EEE, MMM d, ''yy"Wed, Jul 4, '01
"h:mm a"12:08 PM
"hh 'o''clock' a, zzzz"12 o'clock PM, Pacific Daylight Time
"K:mm a, z"0:08 PM, PDT
"yyyyy.MMMMM.dd GGG hh:mm aaa"02001.July.04 AD 12:08 PM
"EEE, d MMM yyyy HH:mm:ss Z"Wed, 4 Jul 2001 12:08:56 -0700 "yyMMddHHmmssZ"010*********-0700
"yyyy-MM-dd'T'HH:mm:ss.SSSZ"2001-07-04T12:08:56.235-0700
⽇期格式是不同步的。建议为每个线程创建独⽴的格式实例。如果多个线程同时访问⼀个格式,则它必须是外部同步的。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论