欢迎访问宙启技术站
智能推送

Java中如何使用DateFormat函数格式化日期和时间?

发布时间:2023-06-26 01:30:21

DateFormat是Java中用来格式化日期、时间以及日期时间的类,它是抽象类,它的实例化类是SimpleDateFormat。DateFormat可以将日期和时间转换成字符串,也可以将字符串转换成日期和时间。下面是一些关于如何使用DateFormat函数格式化日期和时间的介绍。

一、DateFormat函数的常用方法

1、format方法:将指定的日期时间转换为指定格式的字符串

语法:public final String format(Date date)

示例:

import java.text.SimpleDateFormat;
import java.util.Date;

public class DateFormatDemo {

  public static void main(String[] args) {
    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    String currentDate = dateFormat.format(new Date());
    System.out.println("当前时间:" + currentDate);
  }

}

输出结果为:当前时间:2020-11-09 16:26:51

2、parse方法:将指定格式的字符串转换为日期时间

语法:public Date parse(String source) throws ParseException

示例:

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class DateFormatDemo {

  public static void main(String[] args) throws ParseException {
    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
    Date date = dateFormat.parse("2020-11-09");
    System.out.println(date);
  }

}

输出结果为:Mon Nov 09 00:00:00 CST 2020

3、getDateInstance方法:

语法:

public static final DateFormat getDateInstance()

public static final DateFormat getDateInstance(int style)

public static final DateFormat getDateInstance(int style, Locale locale)

示例:

import java.text.DateFormat;
import java.util.Date;
import java.util.Locale;

public class DateFormatDemo {

  public static void main(String[] args) {
    DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.LONG, Locale.FRENCH);
    String currentDate = dateFormat.format(new Date());
    System.out.println(currentDate);
  }

}

输出结果为:9 novembre 2020

4、getTimeInstance方法:

语法:

public static final DateFormat getTimeInstance()

public static final DateFormat getTimeInstance(int style)

public static final DateFormat getTimeInstance(int style, Locale locale)

示例:

import java.text.DateFormat;
import java.util.Date;
import java.util.Locale;

public class DateFormatDemo {

  public static void main(String[] args) {
    DateFormat dateFormat = DateFormat.getTimeInstance(DateFormat.LONG, Locale.GERMAN);
    String currentTime = dateFormat.format(new Date());
    System.out.println(currentTime);
  }

}

输出结果为:16:26:51 MEZ

5、getDateTimeInstance方法:

语法:

public static final DateFormat getDateTimeInstance()

public static final DateFormat getDateTimeInstance(int dateStyle, int timeStyle)

public static final DateFormat getDateTimeInstance(int dateStyle, int timeStyle, Locale locale)

示例:

import java.text.DateFormat;
import java.util.Date;
import java.util.Locale;

public class DateFormatDemo {

  public static void main(String[] args) {
    DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, Locale.CHINA);
    String currentDateTime = dateFormat.format(new Date());
    System.out.println(currentDateTime);
  }

}

输出结果为:2020年11月9日 下午04时26分51秒 CST

二、DateFormat函数的格式化样式

1、日期格式化样式

yyyy:表示年份,如2020

MM:表示月份,如05

M:同上,但是没有前导零

dd:表示日期,如01

d:同上,但是没有前导零

EEE:表示星期几,如周一、周二

E:同上,但是缩写

2、时间格式化样式

HH:表示小时,24小时制,如01、23

h:表示小时,12小时制,如01、11

mm:表示分钟,如01、59

ss:表示秒钟,如01、59

a:表示AM/PM,例如上午或下午

3、常用的格式化样式

yyyy-MM-dd:表示年份-月份-日期,如2020-05-01

yyyy年MM月dd日:表示年份年-月份月-日期日,如2020年5月1日

yyyyMMddHHmmss:表示年份月份日期小时分钟秒钟,如20200501123456

三、DateFormat的线程安全问题

SimpleDateFormat是DateFormat的实例化类。但是SimpleDateFormat类没有考虑线程安全问题,因此在多线程情况下,使用SimpleDateFormat类很容易出现问题。解决方法可以是使用ThreadLocal。

private static ThreadLocal<DateFormat> threadLocal = new ThreadLocal<DateFormat>() {
  protected DateFormat initialValue() {
    return new SimpleDateFormat("yyyy-MM-dd");
  }
};

public static Date parse(String dateStr) throws ParseException {
  return threadLocal.get().parse(dateStr);
}

public static String format(Date date) {
  return threadLocal.get().format(date);
}

将SimpleDateFormat放置在ThreadLocal中,就可以解决SimpleDateFormat的线程安全问题。

四、总结

DateFormat类是Java中用来格式化日期、时间以及日期时间的类,它的实例化类是SimpleDateFormat。DateFormat可以将日期和时间转换成字符串,也可以将字符串转换成日期和时间。DateFormat的方法包括format、parse、getDateInstance、getTimeInstance、getDateTimeInstance等。DateFormat的格式化样式包括日期格式化样式和时间格式化样式。由于SimpleDateFormat类没有考虑线程安全问题,在多线程情况下容易出现问题,使用ThreadLocal可以解决线程安全问题。