JAVA 格式化日期、时间的方法
使用DateFormat格式化日期、时间
DateFormat也是一个抽象类,它也提供了如下几个类方法用于获取DateFormat对象。
- getDateInstance():返回一个日期格式器,它格式化后的字符串只有日期,没有时间。该方法可以传入多个参数,用于指定日期样式和Locale等参数;如果不指定这些参数,则使用默认参数。
- getTimeInstance():返回一个时间格式器,它格式化后的字符串只有时间,没有日期。该方法可以传入多个参数,用于指定时间样式和Locale等参数;如果不指定这些参数,则使用默认参数。
- getDateTimeInstance():返回一个日期、时间格式器,它格式化后的字符串既有日期,也有时间。该方法可以传入多个参数,用于指定日期样式、时间样式和Locale等参数;如果不指定这些参数,则使用默认参数。
上面三个方法可以指定日期样式、时间样式参数,它们是的4个静态常量:FULL、LONG、MEDIUM和SHORT,通过这4个样式参数可以控制生成的格式化字符串。看如下例子程序。
importjava.util.*; importjava.text.*; importstaticjava.text.DateFormat.*; publicclassDateFormatTest{ publicstaticvoidmain(String[]args)throwsParseException{ //需要被格式化的时间 Datedt=newDate(); //创建两个Locale,分别代表中国、美国 Locale[]locales={Locale.CHINA,Locale.US}; DateFormat[]df=newDateFormat[16]; //为上面两个Locale创建16个DateFormat对象 for(inti=0;i上面程序共创建了16个DateFormat对象,分别为中国、美国两个Locale各创建8个DateFormat对象,分别是SHORT、MEDIUM、LONG、FULL四种样式的日期格式器、时间格式器。运行上面程序,会看到如下所示的效果。
----中国日期格式----
SHORT格式的日期格式:20-2-11
MEDIUM格式的日期格式:2020-2-11
LONG格式的日期格式:2020年2月11日
FULL格式的日期格式:2020年2月11日星期二
SHORT格式的时间格式:下午2:26
MEDIUM格式的时间格式:14:26:21
LONG格式的时间格式:下午02时26分21秒
FULL格式的时间格式:下午02时26分21秒CST
----美国日期格式----
SHORT格式的日期格式:2/11/20
MEDIUM格式的日期格式:Feb11,2020
LONG格式的日期格式:February11,2020
FULL格式的日期格式:Tuesday,February11,2020
SHORT格式的时间格式:2:26PM
MEDIUM格式的时间格式:2:26:21PM
LONG格式的时间格式:2:26:21PMCST
FULL格式的时间格式:2:26:21PMCSTDateFormat具有国际化的能力,同一个日期使用不同的Locale格式器格式化的效果完全不同,格式化后的字符串正好符合Locale对应的本地习惯。
获得了DateFormat之后,还可以调用它的setLenient(booleanlenient)方法来设置该格式器是否采用严格语法。举例来说,如果采用不严格的日期语法(该方法的参数为true),对于字符串"2004-2-31"将会转换成2004年3月2日:如果采用严格的日期语法,解析该字符串时将抛出异常。
DateFormat的parse()方法可以把一个字符串解析成Date对象,但它要求被解析的字符串必须符合日期字符串的要求,否则可能抛出ParseExcepuon异常。例如,如下代码片段:
Stringstr1="2017/10/07"; Stringstr2="2017年10月07日"; //下面输出SatOct0700:00:00CST2017 System.out.println(DateFormat.getDateInstance().parse(str2)); //下面输出SatOct0700:00:00CST2017 System.out.println(DateFormat.getDateInstance(SHORT).parse(str1)); //下面抛出ParseException异常 System.out.println(DateFormat.getDateInstance().parse(str1));上面代码中最后一行代码解析日期字符串时引发ParseException异常,因为"2017/10/07"是一个SHORT样式的日期字符串,必须用SHORT样式的DateFormat实例解析,否则将抛出异常。
使用SimpleDateFormat格式化日期
前面介绍的DateFormat的方法可以把字符串解析成Date对象,但实际上DateFormat的parse()方法不够灵活一一它要求被解析的字符串必须满足特定的格式!为了更好地格式化日期、解析日期字符串,Java提供了SimpleDateFormat类。
SimpleDateFormat是DateFormat的子类,正如它的名字所暗示的,它是“简单”的日期格式器。很多读者对“简单”的日期格式器不屑一顾,实际上SimpleDateFormat比DateFormat更简单,功能更强大。
SimpleDateFormat可以非常灵活地格式化Date,也可以用于解析各种格式的日期字符串。创建SimpleDateFormat对象时需要传入一个pattern字符串,这个pattern不是正则表达式,而是一个日期模板字符串。
importjava.text.*; importjava.util.*; publicclassSimpleDateFormatTest{ publicstaticvoidmain(String[]args)throwsParseException{ Dated=newDate(); //创建一个SimpleDateFormat对象 SimpleDateFormatsdf1=newSimpleDateFormat("Gyyyy年中第D天"); //将d格式化成日期,输出:公元2017年中第282天 StringdateStr=sdf1.format(d); System.out.println(dateStr); //一个非常特殊的日期字符串 Stringstr="14###3月##21"; SimpleDateFormatsdf2=newSimpleDateFormat("y###MMM##d"); //将日期字符串解析成日期,输出:FriMar2100:00:00CST2014 System.out.println(sdf2.parse(str)); } }从上面程序中可以看出,使用SimpleDateFormat可以将日期格式化成形如“公元2014年中第101天”这样的字符串,也可以把形如“14###3月##21”这样的字符串解析成日期,功能非常强大。
SimpleDateFormat把日期格式化成怎样的字符串,以及能把怎样的字符串解析成Date,完全取决于创建该对象时指定的pattern参数,pattern是一个使用日期字段占位符的日期模板。
如果读者想知道SimpleDateFormat支持哪些日期、时间占位符,可以查阅API文档中SimpleDateFormat类的说明,此处不再赘述。
Java8新增的日期、时间格式器
Java8新增的日期、时间API里不仅包括了Instant、LocalDate、LocalDateTime、LocalTime等代表日期、时间的类,而且在java.time.format包下提供了一个DateTimeFormatter格式器类,该类相当于前面介绍的DateFormat和SimpleDateFormat的合体,功能非常强大。
与DateFormat、SimpleDateFormat类似,DateTimeFormatter不仅可以将日期、时间对象格式化成字符串,也可以将特定格式的字符串解析成日期、时间对象。
为了使用DateTimeFormatter进行格式化或解析,必须先获取DateTimeFormatter对象,获取DateTimeFormatter对象有如下三种常见的方式。
- 直接使用静态常量创建DateTimeFormatter格式器。DateTimeFormatter类中包含了大量形如ISO_LOCAL_DATE、ISO_LOCAL_TIME、ISO_LOCAL_DATE_TIME等静态常量,这些静态常量本身就是DateTimeFormatter实例。
- 使用代表不同风格的枚举值来创建DateTimeFormatter格式器。在FormatStyle枚举类中定义了FULL、LONG、MEDIUM、SHORT四个枚举值,它们代表日期、时间的不同风格。
- 根据模式字符串来创建DateTmeFormatter格式器。类似于SimpleDateFormat,可以采用模式字符串来创建DateTimeFormatter,如果需要了解支持哪些模式字符串,则需要参该类的API文档。
使用DateTimeFormatter完成格式化
使用DateTimeFormatter将日期、时间(LocalDate、LocalDateTime、LocalTime等实例)格式化为字符串,可通过如下两种方式。
- 调用DateTimeFormatter的format(TemporalAccessortemporal)方法执行格式化,其中LocalDate、LocalDateTime、LocalTime等类都是TemporalAccessor接口的实现类。
- 调用LocalDate、LocalDateTime、LocalTime等日期、时间对象的format(DateTimeFormatterformatter)方法执行格式化。
上面两种方式的功能相同,用法也基本相似,如下程序示范了使用DateTimeFormatter来格式化日期、时间。
importjava.time.*; importjava.time.format.*; publicclassNewFormatterTest{ publicstaticvoidmain(String[]args){ DateTimeFormatter[]formatters=newDateTimeFormatter[]{ //直接使用常量创建DateTimeFormatter格式器 DateTimeFormatter.ISO_LOCAL_DATE, DateTimeFormatter.ISO_LOCAL_TIME, DateTimeFormatter.ISO_LOCAL_DATE_TIME, //使用本地化的不同风格来创建DateTimeFormatter格式器 DateTimeFormatter.ofLocalizedDateTime(FormatStyle.FULL,FormatStyle.MEDIUM), DateTimeFormatter.ofLocalizedDate(FormatStyle.LONG), //根据模式字符串来创建DateTimeFormatter格式器 DateTimeFormatter.ofPattern("Gyyyy%%MMM%%ddHH:mm:ss") }; LocalDateTimedate=LocalDateTime.now(); //依次使用不同的格式器对LocalDateTime进行格式化 for(inti=0;i上面程序使用三种方式创建了6个DateTimeFormatter对象,然后程序中两行粗体字代码分别使用不同方式来格式化日期。运行上面程序,会看到如下所示的效果。
2020-02-11
2020-02-11
17:13:00.303
17:13:00.303
2020-02-11T17:13:00.303
2020-02-11T17:13:00.303
2020年2月11日星期二17:13:00
2020年2月11日星期二17:13:00
2020年2月11日
2020年2月11日
公元2020%%二月%%1117:13:00
公元2020%%二月%%1117:13:00可以看出,使用DateTimeFormatter进行格式化,也可使用模式字符串对日期、时间进行自定义格式化,由此可见,功能完全覆盖了传统的DateFormat、SimpleDateFormate的功能。
提示:有些时候,读者可能还需要使用传统的DateFormat来执行格式化,DateTimeFormatter则提供了一个toFormat()方法,该方法可以获取DateTimeFormatter对应的Format对象。
使用DateTimeFormatter解析字符串
为了使用DateTimeFormatter将指定格式的字符串解析成日期、时间对象(LocalDate、LocalDateTime、LocalTime等实例),可通过日期、时间对象提供的parse(CharSequencetext,DateTimeFormatterformatter)方法进行解析。
如下程序示范了使用DateTimeFormatter解析日期、时间字符串。
importjava.time.*; importjava.time.format.*; publicclassNewFormatterParse{ publicstaticvoidmain(String[]args){ //定义一个任意格式的日期时间字符串 Stringstr1="2014==04==1201时06分09秒"; //根据需要解析的日期、时间字符串定义解析所用的格式器 DateTimeFormatterfomatter1=DateTimeFormatter.ofPattern("yyyy==MM==ddHH时mm分ss秒"); //执行解析 LocalDateTimedt1=LocalDateTime.parse(str1,fomatter1); System.out.println(dt1);//输出2014-04-12T01:06:09 //---下面代码再次解析另一个字符串--- Stringstr2="2014$$$4月$$$1320小时"; DateTimeFormatterfomatter2=DateTimeFormatter.ofPattern("yyy$$$MMM$$$ddHH小时"); LocalDateTimedt2=LocalDateTime.parse(str2,fomatter2); System.out.println(dt2);//输出2014-04-13T20:00 } }上面程序中定义了两个不同格式的日期、时间字符串,为了解析它们,程序分别使用对应的格式字符串创建了DateTmeFormatter对象,这样DateTimeFormatter即可按该格式字符串将日期、时间字符串解析成LocalDateTime对象。编译、运行该程序,即可看到两个日期、时间字符串都被成功地解析成LocalDateTime。
以上就是JAVA格式化日期、时间的方法的详细内容,更多关于JAVA格式化日期、时间的资料请关注毛票票其它相关文章!