概述
SimpleDateFormat类主要用于格式化日期Date类为字符串和将日期格式的字符串转换成Date类。
构造方法
构造器 | 说明 | 示例 |
---|---|---|
public SimpleDateFormat() | 无参构造器。 | SimpleDateFormat dateFormat=new SimpleDateFormat(); |
public SimpleDateFormat(String pattern) | 指定日期模式的构造器。常用。 | SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd"); |
public SimpleDateFormat(String pattern, Locale locale) | 使用给定模式和给定语言环境的默认日期格式符号构造一个SimpleDateFormat 。不常用。 | SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd", Locale.CHINESE); |
SimpleDateFormat类最常用的构造方法就是第二个,在构造器中指定日期模式。
pattern模式字符串
pattern模式字符串中可以使用的日期标识有如下这些:
匹配模式 | 备注 |
---|---|
yyyy | 年 |
MM | 月 |
dd | 日 |
hh | 12小时制(1~12) |
HH | 24小时制(0~23) |
mm | 分 |
ss | 秒 |
S | 毫秒 |
E | 星期几 |
D | 一年中的第几天 |
F | 一月中的第几个星期 |
w | 一年中的第几个星期 |
W | 一月中的第几个星期 |
a | 上下午标识 |
k | 和HH差不多,表示24小时制(1~24) |
K | 和hh差不多,表示12小时制(0~11) |
z | 表示时区 |
实例如下:
public class Demo {
public static void main(String[] args) {
SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒 S毫秒 a z");
String format = dateFormat.format(new Date());
System.out.println(format);
}
}
常用方法
将日期字符串转换成Date类对象
常将日期格式字符串转换成Date类对象的方法是parse()方法。其API说明如下:
成员方法 | 说明 |
---|---|
public Date parse(String source) | 从字符串的开头将指定字符串解析成日期对象Date。常用。 |
public abstract Date parse(String source, ParsePosition pos) | 从字符串的指定位置将指定字符串解析成日期对象Date。默认情况下,解析是宽松的:如果输入不是此对象的格式方法使用的形式,但仍然可以解析为日期,则解析成功。 客户可以通过调用setLenient(false) 来坚持严格遵守格式。 |
对应的实例是:
public class Demo {
public static void main(String[] args) throws NoSuchMethodException, NoSuchFieldException, ParseException {
// parse(String source)方法
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
// 可以解析完全符合pattern模式字符串的日期字符串
Date date1 = dateFormat.parse("2021-12-13");
System.out.println(date1);
// 可以解析字符串左匹配pattern模式字符串的日期字符串,即从字符串开头匹配解析
Date date2 = dateFormat.parse("2021-12-13日期之后,我们开始说Hello World...");
System.out.println(date2);
// 但如果字符串开头不匹配pattern模式字符串,那么该方法将报错
//Date date3 = dateFormat.parse("起始日期是2021-12-13");
//System.out.println(date3);// 抛出异常:java.text.ParseException: Unparseable date: "起始日期是2021-12-13"
// parse(String source, ParsePosition pos)方法
// 可以解析完全符合pattern模式字符串的日期字符串,但ParsePosition的起始索引应该设置为0
Date date4 = dateFormat.parse("2021-12-13", new ParsePosition(0));
System.out.println(date4);
// 可以解析字符串左匹配pattern模式字符串的日期字符串,即从字符串开头匹配解析,即index表示第几个字符(从1开始)
Date date5 = dateFormat.parse("2021-12-13日期之后,我们开始说Hello World...", new ParsePosition(0));
System.out.println(date5);
// 如果字符串开头不匹配pattern模式字符串,那么就可以利用ParsePosition类设置匹配的索引位置,从1开始
Date date6 = dateFormat.parse("起始日期是2021-12-13", new ParsePosition(5));
System.out.println(date6);
}
}
将Date类对象转换成日期字符串
成员方法 | 说明 |
---|---|
public final String format(Date date) | 将Date日期类对象转换成日期/时间字符串。常用。 |
public abstract StringBuffer format(Date date, StringBuffer toAppendTo, FieldPosition fieldPosition) | 将Date日期类对象转换成日期/时间字符串。date是要格式化为日期/时间的Date对象;toAppendTo返回日期/时间字符串的字符串缓冲区。fieldPosition是跟踪返回字符串中字段的位置。 |
常用的就是format(Date date)方法。将Date日期对象转换成日期格式字符串。实例代码如下:
public class Demo {
public static void main(String[] args) {
SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String format = dateFormat.format(new Date());
System.out.println(format);
}
}
其他方法
void setLenient(boolean lenient)
该方法的API如下:
/**
* 设置日期/时间的解析是否宽松。
* 如果设置了宽松解析(即设置为true),那么解析器可以解析与此对象格式不精确匹配的输入。
* 如果设置了严格解析(即设置为false),那么输入必须与此对象的格式严格匹配。
* 此方法等效于:getCalendar().setLenient(lenient)。
*
* @param lenient 当为true,解析是宽松的;当为false,解析是严格的
*/
public void setLenient(boolean lenient)
{
calendar.setLenient(lenient);
}
可能只是看介绍是无法明白严格解析和宽松解析的区别。看下面的代码可能有更清晰的认知:
public class Demo {
public static void main(String[] args) throws ParseException {
SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd");
// 宽松解析,即虽然"2021-26-15"这个日期字符串中关于月份的日期不对,但通过宽松解析,26个月可以解析为2年2个月,而不会报错
dateFormat.setLenient(true);
Date date1 = dateFormat.parse("2021-26-15");
System.out.println(date1);
// 严格解析,即"2021-26-15"中的月份数字只能是1到12,不能是其他数字,否则会报错,无法解析成功
dateFormat.setLenient(false);
Date date2 = dateFormat.parse("2021-26-15");// java.text.ParseException: Unparseable date: "2021-26-15"
System.out.println(date2);
}
}