java 日期格式化类SimpleDateFormat的使用:日期转字符,字符转日期

java 日期格式化类SimpleDateFormat的使用:日期转字符,字符转日期


博客背景,本人是名java实习生,在实习阶段遇到了遇到了业务需求非常奇葩的医疗软件,其对时间格式的要求非常的奇葩,所以写这篇博客以总结和记录 SimpleDateFormat类日期格式转换的用法。

1. java.text.SimpleDateFormat类

  1. SimpleDateFormat是一个不与语言环境有关的方式来格式化和解析日期的具体类。
  2. 它允许进行格式化(日期文本)、解析(文本日期)

==格式化:==文本 使用SimpleDateFormat的format()方法

  1. SimpleDateFormat() :默认的模式和语言环境创建对象
  2. public SimpleDateFormat(String pattern):该构造方法可以用参数pattern指定的格式创建一个对象,该对象调用:
  3. public String format(Date date):方法格式化时间对象date

==解析:==日期 使用SimpleDateFormat的parse()方法

  1. public Date parse(String source):从给定字符串的开始解析文本,以生成一个日期。

注:==解析和格式化的pattern格式得保持一致。=
demo

@Test
	public void test2() throws ParseException {
		//1.格式化1
		SimpleDateFormat sdf = new SimpleDateFormat();
		String date = sdf.format(new Date());
		System.out.println(date);//18-12-8 下午3:17,默认格式
		//2.格式化2
		SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
		date = sdf1.format(new Date());
		System.out.println(date);//2018-12-08T15:24:23.367+0800
		
		//3.解析
		Date date1 = sdf.parse("18-12-8 下午3:17");
		System.out.println(date1);//Sat Dec 08 15:17:00 CST 2018
		
		Date date2 = sdf1.parse("2018-12-08T15:24:23.367+0800");
		System.out.println(date2);
	}

2.SimpleDateFormat 相关格式说明和理解

2.1 日期和时间模式

日期和时间格式由日期和时间模式 字符串指定。在日期和时间模式字符串中,未加引号的字母 ‘A’ 到 ‘Z’ 和 ‘a’ 到 ‘z’ 被解释为模式字母,用来表示日期或时间字符串元素。文本可以使用单引号 (’) 引起来,以免进行解释。"’’" 表示单引号。所有其他字符均不解释;只是在格式化时将它们简单复制到输出字符串,或者在解析时与输入字符串进行匹配。

理解:即在解析和或者格式化的时候,只对字母进行解析,而被单引号括起来的子串不进行解析,及我们可以随意拼接成我们想要格式,如:“hh ‘o’‘clock’ a, zzzz” 结果为:12 o’clock PM, Pacific Daylight Time ,“yyyy年MM月dd日” 结果为:2018年12月8日

定义了以下模式字母(所有其他字符 ‘A’ 到 ‘Z’ 和 ‘a’ 到 ‘z’ 都被保留):
api
模式字母通常是重复的,其数量确定其精确表示:

  1. Text: 对于格式化来说,如果模式字母的数量大于等于 4,则使用完全形式;否则,在可用的情况下使用短形式或缩写形式。对于解析来说,两种形式都是可接受的,与模式字母的数量无关。

  2. Number: 对于格式化来说,模式字母的数量是最小的数位,如果数位不够,则用 0 填充以达到此数量。对于解析来说,模式字母的数量被忽略,除非必须分开两个相邻字段。

  3. Year: 如果格式器的 Calendar 是格里高利历,则应用以下规则。

    • 对于格式化来说,如果模式字母的数量为 2,则年份截取为 2 位数,否则将年份解释为 number。
    • 对于解析来说,如果模式字母的数量大于 2,则年份照字面意义进行解释,而不管数位是多少。因此使用模式 “MM/dd/yyyy”,将 “01/11/12” 解析为公元 12 年 1 月 11 日。
    • 在解析缩写年份模式(“y” 或 “yy”)时,SimpleDateFormat 必须相对于某个世纪来解释缩写的年份。这通过将日期调整为 SimpleDateFormat 实例创建之前的 80 年和之后 20 年范围内来完成。例如,在 “MM/dd/yy” 模式下,如果 SimpleDateFormat 实例是在 1997 年 1 月 1 日创建的,则字符串 “01/11/12” 将被解释为 2012 年 1 月 11 日,而字符串 “05/04/64” 将被解释为 1964 年 5 月 4 日。在解析时,只有恰好由两位数字组成的字符串(如 Character.isDigit(char) 所定义的)被解析为默认的世纪。其他任何数字字符串将照字面意义进行解释,例如单数字字符串,3 个或更多数字组成的字符串,或者不都是数字的两位数字字符串(例如"-1")。因此,在相同的模式下, “01/02/3” 或 “01/02/003” 解释为公元 3 年 1 月 2 日。同样,“01/02/-3” 解析为公元前 4 年 1 月 2 日。

否则,则应用日历系统特定的形式。对于格式化和解析,如果模式字母的数量为 4 或大于 4,则使用日历特定的 long form。否则,则使用日历特定的 short or abbreviated form。

  1. Month: 如果模式字母的数量为 3 或大于 3,则将月份解释为 text;否则解释为 number。

  2. General time zone: 如果时区有名称,则将它们解释为 text。对于表示 GMT 偏移值的时区,使用以下语法:
    GMTOffsetTimeZone:
    GMT Sign Hours : Minutes
    Sign: one of
    + -
    Hours:
    Digit
    Digit Digit
    Minutes:
    Digit Digit
    Digit: one of
    0 1 2 3 4 5 6 7 8 9Hours 必须在 0 到 23 之间,Minutes 必须在 00 到 59 之间。格式是与语言环境无关的,并且数字必须取自 Unicode 标准的 Basic Latin 块。
    对于解析来说,RFC 822 time zones 也是可接受的。

  3. RFC 822 time zone: 对于格式化来说,使用 RFC 822 4-digit 时区格式:
    RFC822TimeZone:
    Sign TwoDigitHours Minutes
    TwoDigitHours:
    Digit DigitTwoDigitHours 必须在 00 和 23 之间。其他定义请参阅 general time zones。
    对于解析来说,general time zones 也是可接受的。

SimpleDateFormat 还支持本地化日期和时间模式 字符串。在这些字符串中,以上所述的模式字母可以用其他与语言环境有关的模式字母来替换。SimpleDateFormat 不处理除模式字母之外的文本本地化;而由类的客户端来处理。

2.2 示例

以下示例显示了如何在美国语言环境中解释日期和时间模式。给定的日期和时间为美国太平洋时区的本地时间 2001-07-04 12:08:56。
实例

2.3 同步

日期格式是不同步的。建议为每个线程创建独立的格式实例。如果多个线程同时访问一个格式,则它必须是外部同步的。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值