Java用DateFormat,simpleDateFormat,DateTimeFormat格式化时间和日期

在java中格式化时间和日期或者把字符串转换成日期和时间都可以用DateFormat,simpleDateFormat类,而且在JAVA8中还添加了DateTimeFormat格式化日期和时间,使这些转换越来越简单。

使用DateFormat格式化时间或者日期
1.时间或者日格式成字符串用format()
DateFormat是一个抽象类,提供了这几种方法来获取DateFormat对象:

  1. DateFormat.getDateInstance():返回一个日期格式器,它格式化后的字符串只有日期,没有时间,可以传入多个参数。
  2. DateFormat.getTimeInstance():返回一个时问格式器,它格式化后的字符串只有时间,没有日期。
  3. DateFormat.getDateTimeInstance():返回一个日期、时问格式器,它格式化后的字符串既有日期,也有时间。

上面3个方法可以指定日期,时间样式、它们是DateFormat的4个静态常量:FULL,LONG,MEDIUM,SHORT,通过4个样式参数可以控制生成的格式化字符串。如:

  1. public class test {
  2. public static void main (String arg[]){
  3. Date date=new Date();
  4. Locale[] locales={Locale.CANADA,Locale.US};
  5. DateFormat[] das=new DateFormat[10];
  6. for(int i=0;i<locales.length;i++)
  7. {
  8. //四种样式
  9. das[i*5]=DateFormat.getDateInstance(DateFormat.SHORT,locales[i]);
  10. das[i*5+1]=DateFormat.getDateInstance(DateFormat.MEDIUM,locales[i]);
  11. das[i*5+2]=DateFormat.getDateInstance(DateFormat.LONG,locales[i]);
  12. das[i*5+3]=DateFormat.getDateInstance(DateFormat.FULL,locales[i]);
  13. das[i*5+4]=DateFormat.getDateInstance();
  14. }
  15. for(int i=0;i<locales.length;i++)
  16. {
  17. String tip=i==0?"------中国日期格式":"美国日期格式";
  18. System.out.println(tip);
  19. System.out.println("SHORT:"+das[i*5].format(date));
  20. System.out.println("MEDIUM:"+das[i*5+1].format(date));
  21. System.out.println("LONG:"+das[i*5+2].format(date));
  22. System.out.println("FULL:"+das[i*5+3].format(date));
  23. System.out.println("没有指定:"+das[i*5+4].format(date));
  24. }
  25. }
  26. }

结果是:

这个例子创建的是日期的格式,分别指定了locale和日期输出的样式,创建DateFormat对象没有给它参数时,会用默认的。

2.字符串转换成日期或者时间
DateFormat的parse()方法可以把一个字符串解析成Date对象,但它要求被解析的字符串必须符合日期期字符串的要求,否则可能抛出
ParseException异常

  1. public class test {
  2. public static void main (String arg[]){
  3. String str1="2019-3-3";
  4. String str2="2019年3月3日";
  5. try {
  6. System.out.println(DateFormat.getDateInstance().parse(str1));
  7. }catch (ParseException ex)
  8. {
  9. //如果这个会抛出错误,从而执行这行
  10. System.out.println("str1::"+ex.getMessage());
  11. }
  12. try {
  13. System.out.println(DateFormat.getDateInstance().parse(str2));
  14. }catch (ParseException ex)
  15. { //如果这个会抛出错误,从而执行这行
  16. System.out.println("str2::"+ex.getMessage());
  17. }
  18. }
  19. }

结果:

由于第2个格式不对,所以抛出错误。

使用SimpleDateFormat格式化时间或者日期
前面介绍的DateFormat的parse()方法可以把字符串解析成Date寸象,但实际DateFormat的parse()方法不够灵活—它要求被解析的字符串必须满足特定的格式!为了更好地格式化日期、解析日期字符串,Java提供了SimpIeDateFormat类。SimpIeDateFormat是DateFormat的子类,正如它的名字所暗示的,它是“简单”的日期格式器,但是SimpIeDateFormat比DateFormat更简单,功能强大。

  1. SimpleDateFormat函数语法:
  2. G 年代标志符
  3. y
  4. M
  5. d
  6. h 在上午或下午 (1~12)
  7. H 在一天中 (0~23)
  8. m
  9. s
  10. S 毫秒
  11. E 星期
  12. D 一年中的第几天
  13. F 一月中第几个星期几
  14. w 一年中第几个星期
  15. W 一月中第几个星期
  16. a 上午 / 下午 标记符
  17. k 在一天中 (1~24)
  18. K 在上午或下午 (0~11)
  19. z 时区

创建SimpleDateFormat对象需要传入一个pattern字符串,这个pattern不是正则表达式,而是一个日期模板字符串。

  1. public class test {
  2. public static void main (String arg[])throws ParseException{
  3. Date d=new Date();
  4. SimpleDateFormat simpleDateFormat=new SimpleDateFormat("Gyyyy年中第D天");
  5. String dateStr=simpleDateFormat.format(d);
  6. System.out.println("把时间格式成字符串:"+dateStr);
  7. String str="14###三月##21";
  8. SimpleDateFormat simpleDateFormat1=new SimpleDateFormat("y###MMM##d");
  9. System.out.println("把字符串格式成时间:"+simpleDateFormat1.parse(str));
  10. //字符串转换成Date
  11. str="2019-03-23";
  12. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
  13. Date data=sdf.parse(str);
  14. }
  15. }

结果:

  1. 把时间格式成字符串:公元2019年中第62
  2. 把字符串格式成时间:Fri Mar 21 00:00:00 CST 2014
  3. Process finished with exit code 0

SimpleDateFormat可以自定义格式,更简单和方便。

使用DateTimeFormatter完成格式化
使用DateTimeFormatter将日期、时间( LocalDate. LocalDateTime, LocalTime等实例)格式化为字符串可通过如下两种方式。

  1. 调用DateTimeFormatterformat(TemporalAccessor temporal)方法执行格式化,其中LocalDate. LocalDateTime, LocalTime等类都是TemporalAccessor接口的实现类。
  2. 调用 LocalDate, LocalDateTime, LocalTime等日期、时间对象的format(DateTimeFormatter formatter)方法执行格式化。

1

  1. public class test {
  2. public static void main (String arg[])throws ParseException{
  3. //创建5个DateTimeFormatter对象
  4. DateTimeFormatter[] formatters=new DateTimeFormatter[]{
  5. //使用常量创建对象
  6. DateTimeFormatter.ISO_LOCAL_DATE,
  7. DateTimeFormatter.ISO_LOCAL_TIME,
  8. DateTimeFormatter.ISO_LOCAL_DATE_TIME,
  9. //使用本地化风格创建
  10. DateTimeFormatter.ofLocalizedDateTime(FormatStyle.LONG),
  11. //自定义创建
  12. DateTimeFormatter.ofPattern("Gyyyy%%MMM%%dd HH:mm:ss")
  13. };
  14. LocalDateTime dateTime=LocalDateTime.now();
  15. for (int i=0;i<formatters.length;i++)
  16. {
  17. //这2行代码一样
  18. System.out.println(dateTime.format(formatters[i]));
  19. // System.out.println(formatters[i].format(dateTime));
  20. }
  21. }
  22. }

结果:

  1. 2019-03-03
  2. 16:25:27.199
  3. 2019-03-03T16:25:27.199
  4. 201933 下午042527
  5. 公元2019%%三月%%03 16:25:27
  6. Process finished with exit code 0

使用DateTimeFormatter解析字符串
为了使用LocaIDateTime、DateTimeFormatter将指定格式的字符串解析成日期、时间对象(LocalDate ,LocalTime等实例),可通过日期、I时间对象提供的parse(CharSequence text ,DateTimeFormatter formatter)方法进行解析。

  1. public class test {
  2. public static void main (String arg[])throws ParseException{
  3. //定义一个任意格式的日期、l讨间字符串
  4. String strl="2014-04-12 O1时06分09秒";
  5. //根据需要解析的日期、时间字符串定义解析所用的格式器
  6. DateTimeFormatter fomatterl=DateTimeFormatter.ofPattern("yyyy-MM-dd HH时mm分ss秒");
  7. //执行解析
  8. LocalDateTime dtl=LocalDateTime.parse(strl,fomatterl);
  9. System.out.println(dtl);//输出2014一04一12T01:06:09
  10. }
  11. }