SimpleDateFormat类的使用

Posted 二木成林

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SimpleDateFormat类的使用相关的知识,希望对你有一定的参考价值。

概述

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
hh12小时制(1~12)
HH24小时制(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);
    }
}

以上是关于SimpleDateFormat类的使用的主要内容,如果未能解决你的问题,请参考以下文章

SimpleDateFormat类的线程安全问题和解决方案

大数据基础之java常用API三(SimpleDateFormat类和Calendar类的使用)

SimpleDateFormat类的安全问题,这6个方案总有一个适合你

SimpleDateFormat关于时间类的一些常用处理

请别再使用 SimpleDateFormat 格式化时间了,DateTimeFormatter 更出色!

请别再使用 SimpleDateFormat 格式化时间了,DateTimeFormatter 更出色!