常用类库之Java.text.SimpleDateFormat

Java中常用日期格式类SimpleDateFormat日期格式设置详解

SimpleDateFormat类概述–JDK11API

Class SimpleDateFormat
java.lang.Object
 java.text.Format
  java.text.DateFormat
   java.text.SimpleDateFormat
实现的所有接口  Serializable , Cloneable
public class SimpleDateFormat extends DateFormat


SimpleDateFormat是一个用于以区域设置敏感的方式格式化和解析日期的具体类。 它允许格式化(日期→文本),解析(文本→日期)和规范化。
SimpleDateFormat允许您从为日期时间格式选择任何用户定义的模式开始。 不过,建议您创建一个日期-时间格式有两种getTimeInstance , getDateInstance ,或getDateTimeInstance在DateFormat 。 这些类方法中的每一个都可以返回使用默认格式模式初始化的日期/时间格式化程序。 您可以根据需要使用applyPattern方法修改格式模式。


日期和时间模式
日期和时间格式由日期和时间模式字符串指定。 在日期和时间模式字符串中,从’A’到’Z’以及从’a’到’z’未加引号的字母被解释为表示日期或时间字符串的组成部分的模式字母。 可以使用单引号( ’ )引用文本以避免解释。 "’’"代表单引号。 不解释所有其他字符; 它们只是在格式化过程中被复制到输出字符串中,或者在解析过程中与输入字符串匹配。
定义了以下模式字母(从’A’到’Z’以及从’a’到’z’所有其他字符都是保留的):
SimpleDateFormat里已定义的格式字符

SimpleDateFormat里的常用方法

三种常用的构造方法

SimpleDateFormat()    // 构造一个 SimpleDateFormat使用默认模式和日期格式符号默认 FORMAT区域设置。 
SimpleDateFormat​(String pattern)  // 使用给定的模式和日期格式符号构造 SimpleDateFormat 。 
SimpleDateFormat​(String pattern, Locale locale)  // 使用给定模式和给定语言环境的默认日期格式符号构造 SimpleDateFormat 。 

两种查看日期格式的方法

1.public String toLocalizedPattern()
作用:返回描述此日期格式的本地化模式字符串。 
结果:描述此日期格式的本地化模式字符串。
使用:
SimpleDateFormat format = new SimpleDateFormat();
System.out.println(format.toLocalizedPattern());
打印结果:
y/M/d ah:mm

2.public String toPattern()
作用:返回描述此日期格式的模式字符串。 
结果:描述此日期格式的模式字符串。 
使用:
SimpleDateFormat format1 = (SimpleDateFormat) DateFormat.getDateInstance();
System.out.println(format1.toPattern());
打印结果:
y年M月d日

两种解析字符串文本生成日期的方法

1.parse​(String source)   // public Date parse​(String source) throws ParseException
该方法继承其父类DateFormat,作用:从给定字符串的开头解析文本以生成日期。 该方法可能不使用给定字符串的整个文本。
参数 source - 应该解析其开头的 String 
结果 从字符串解析的 Date 。 
异常 ParseException - 如果无法解析指定字符串的开头。
使用:
SimpleDateFormat format1 = (SimpleDateFormat) DateFormat.getDateInstance();
// 格式为 y年M月d日
Scanner input = new Scanner(System.in);
String text1 = input.next();
Date date1 = format1.parse(text1);
System.out.println(date1);
打印结果:
输入  20201221日
输出  Mon Dec 21 00:00:00 CST 2020
有正确的输出,说明该输入的文本确实已经被成功解析为date1对象

2.parse​(String text, ParsePosition pos)   // public Date parse​(String text, ParsePosition pos)
作用:解析字符串中的文本以生成 Date 。 
参数; text - A String ,其中一部分应该被解析。  pos - 具有 ParsePosition索引和错误索引信息的 ParsePosition对象。 
结果:从字符串解析的Date 。 如果出现错误,则返回null。
异常:NullPointerException - 如果 text或 pos为空。  
//该方法尝试从pos给出的索引处开始解析文本。 
//如果解析成功,则在使用最后一个字符之后将索引pos更新为索引(解析不一定使用直到字符串末尾的所有字符),并返回解析的日期。 更新的pos可用于指示下一次调用此方法的起点。 
//如果发生错误,则不更改索引pos ,将错误索引pos设置为发生错误的字符的索引,并返回null。 
//此解析操作使用calendar生成Date 。 在解析之前,所有calendar的日期时间字段都是cleared ,并且calendar的日期时间字段的默认值用于任何缺少的日期时间信息。
// 例如,如果解析操作没有给出年份值,则解析的Date的年份值为1970, 其中 Date为GregorianCalendar 。 可能会覆盖TimeZone值,具体取决于给定的模式和text的时区值。 之前通过调用setTimeZone设置的任何TimeZone值可能需要恢复以进行进一步操作。
使用:
Scanner input = new Scanner(System.in);
String text2 = input.next();
ParsePosition position = new ParsePosition(3);
Date date2 = format1.parse(text2,position);
System.out.println(date2);
输入: 今天是2021125日
输出: Mon Jan 25 00:00:00 CST 2021
由此可见,date2创建成功,即输入的文本text2成功从字符串数组下标为  index= 3 实际上是第4个字符处开始解析格式是否符合format1的 y年M月d日 的格式

动手敲代码验证各种格式

通过DateFormat里的几种默认格式的方法

DateFormat里提供的几个默认格式的方法的调用:

SimpleDateFormat format1 = (SimpleDateFormat) DateFormat.getDateInstance();
SimpleDateFormat format2 = (SimpleDateFormat) DateFormat.getDateTimeInstance();
SimpleDateFormat format3 = (SimpleDateFormat) DateFormat.getTimeInstance();
Date date = new Date();
System.out.println(format1.format(date));
System.out.println(format1.toPattern());
System.out.println(format2.format(date));
System.out.println(format1.toPattern());
System.out.println(format3.format(date));
System.out.println(format3.toPattern());
打印结果:
2021124日     y年M月d日  //  DateFormat.getDateInstance()
2021124日 下午5:18:20  y年M月d日 ah:mm:ss   //DateFormat.getDateTimeInstance();
下午5:18:20   ah:mm:ss  // DateFormat.getTimeInstance()

自定义日期格式

SimpleDateFormat里定义的日期格式字符解释:
y	--- 	年份
Y	--- 	按周计算的年,与y的区别在于一年的第一周和最后一周,一般不用Y
M	---	月份Month in year (context sensitive) 
L	---	月份Month in year (standalone form)  暂时不知道M与L的区别,测试两者结果一致
w	---	一年中的周数即当前年份的第几周
W	---	当前月中的周数即第几周
D	---	一年中的天数即当前年的第几天
d	---	一月中的天数即当前月份的第几天
F 	---	是当前月份的第几周
E	---	当前日期是星期几的名字   满足local比如当前是CHINA 输出的名字是 汉字 例如“周日”   
u	---	当前日期在当前周的天数的序号, 取指范围 “1~7” 对应周一到周日
a	---	按照am/pm的方式显示当前处于am还是pm,和 h 连用 变成12小时 制,输出时间范围 0~11“” 支持local 在CHINA 下显示 中文 “上午”/“下午”
H	---	0~23  24小时制表示时间
k	---	1~24 24小时制表示时间
K	---	0~11 am/pm 12小时制表示时间
h	---	1~12 am/pm 12小时制表示时间
m	---	minute 表示分钟
s	---	second 表示秒
S	---	Millisecond 表示毫秒
z	---	Time zone 表示时区
Z	---	Time zone 表示时区
X	---	Time zone 表示时区    Z,X,z三者的区别在于时区的算法不同,此处不深究
G	---	Era designator  选择器,当格式中涉及到的字母数多的时候可以简写yyyy MM 为y M 等等。


SimpleDateFormat的三种常用构造方法:

1.SimpleDateFormat()    生成该方法下的默认格式日期:
SimpleDateFormat format = new SimpleDateFormat();
System.out.println(format.format(date));
System.out.println(format.toPattern());
打印结果: 
2021/1/24 下午5:58
y/M/d ah:mm      // 这就是 SimpleDateFormat() 方法的默认格式

2.SimpleDateFormat​(String pattern)  
//构造一个 SimpleDateFormat使用给定的模式和默认的默认日期格式符号 FORMAT区域设置。 
此方法生成的日期格式为自定义的 字符串格式 pattern

SimpleDateFormat format4 = new SimpleDateFormat("yyyy-MM-dd ahh:mm:ss");
System.out.println(format4.format(date));
打印结果:
2021-01-24 下午06:10:27

3.SimpleDateFormat​(String pattern, Locale locale)   
//使用给定模式和给定语言环境的默认日期格式符号构造 SimpleDateFormat 。  
SimpleDateFormat format6 = new SimpleDateFormat("yyyy年MM月dd日是该年的第D天第w周,是L月的第W周的第u天E,该天现在时间为ah时mm分ss秒", Locale.CHINA);
System.out.println(format6.format(date));
打印结果:
20210125日是该年的第25天第5周,是1月的第5周的第1天周一,该天现在时间为上午121114秒

此时若把 Local.CHINA 改为 Local.US , 则打印结果变为:
20210125日是今年的第25天第5周,是1月的第5周的第1天Mon,该天现在时间为AM12时1114秒
此处注意 我当前的时间为0:11,由此可以验证h的取指是从1~12下面我们单独改时间试试 H k K

H:
SimpleDateFormat format7 = new SimpleDateFormat("当前时间为HH时mm分ss秒",Locale.CHINA);
System.out.println(format7.format(date));
打印结果:
当前时间为001705秒
可见 H 是 正常的24小时制显示时间

k:
SimpleDateFormat format8 = new SimpleDateFormat("当前时间为kk时mm分ss秒",Locale.CHINA);
System.out.println(format8.format(date));
打印结果:
当前时间为242701秒
可见 k 是 1~2424小时制,0时表达为24时

K:
SimpleDateFormat format9 = new SimpleDateFormat("当前时间为a KK时mm分ss秒",Locale.CHINA);
System.out.println(format9.format(date));
打印结果:
当前时间为上午 003230秒
可见 K 是 0~11 12小时制, 此时需要加上 a 来判断是am还是pm/ 上午还是下午

h:
SimpleDateFormat format10 = new SimpleDateFormat("当前时间为a hh时mm分ss秒",Locale.CHINA);
System.out.println(format10.format(date));
打印结果:
当前时间为上午 125108秒
可见 h 是 1~12 12小时制,此时需要加上 a 来判断是am还是pm/ 上午还是下午

猜你喜欢

转载自blog.csdn.net/qq_40694640/article/details/113093031