Java 字符串转为日期的最好方式| Java Debug 笔记

692 阅读2分钟

本文正在参加「Java主题月 - Java Debug笔记活动」,详情查看

译:Java 字符串转为日期的最好方式,原文链接

问题

在 Java 中,'January 2, 2010' 这种格式的字符串转为日期格式的最好方式是什么?

PS:我最终想获取 long 类型的时间戳。

// 我尝试使用的是日期自带方法
Date date = new Date();
date.setMonth()..
date.setYear()..
date.setDay()..
date.setlong currentTime = date.getTime();

回答1

java.util.Datesetter 方法是很麻烦的,并且在 Java1.1(1997) 中已经废弃了。

可以使用 SimpleDateFormat 这种更简单的日期格式化工具,通过 pattern 格式化输入字符串。

参考文档:docs.oracle.com/javase/8/do…

针对你给的例子 'January 2, 2010' 使用说明如下:

  1. "January" 是月份(英文全称),使用 MMMM 作为 pattern
  2. "2" 是当前月份下的日,使用 d 作为 pattern
  3. "2010" 是四位的年份,使用 yyyy 作为 pattern
String string = "January 2, 2010";
DateFormat format = new SimpleDateFormat("MMMM d, yyyy", Locale.ENGLISH);
Date date = format.parse(string);
System.out.println(date); // Sat Jan 02 00:00:00 GMT 2010

PS:对于 SimpleDateFormat 中的第二个参数 locale,不传使用环境默认的语言进行解析。示例给的是英语,所以传入英语进行解析,不然程序会抛出 java.text.ParseException,哪怕 pattern 看着是对的。

以下是 javadoc 官方文档提供的 patterns:

image.png

PS:这些 patterns 是区分大小写的!

四个字符就可以表示月份的全拼了,不需要在写更多个,以下是一些使用 SimpleDateFormat patterns 的最佳实践:

字符串pattern
2001.07.04 AD at 12:08:56 PDTyyyy.MM.dd G 'at' HH:mm:ss z
Wed, Jul 4, '01EEE, MMM d, ''yy
12:08 PMh:mm a
12 o'clock PM, Pacific Daylight Timehh 'o''clock' a, zzzz
0:08 PM, PDTK:mm a, z
02001.July.04 AD 12:08 PMyyyyy.MMMM.dd GGG hh:mm aaa
Wed, 4 Jul 2001 12:08:56 -0700EEE, d MMM yyyy HH:mm:ss Z
010704120856-0700yyMMddHHmmssZ
2001-07-04T12:08:56.235-0700yyyy-MM-dd'T'HH:mm:ss.SSSZ
2001-07-04T12:08:56.235-07:00yyyy-MM-dd'T'HH:mm:ss.SSSXXX
2001-W27-3YYYY-'W'ww-u

!!重要!!

SimpleDateFormat 非线程安全

SimpleDateFormat 非线程安全

SimpleDateFormat 非线程安全

每次使用时切记不要使用静态变量/实例变量,并且保证 SimpleDateFormat 的作用域在本地范围之内。超出本地范围内请创建全新的对象。