本文正在参加「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.Date 的 setter 方法是很麻烦的,并且在 Java1.1(1997) 中已经废弃了。
可以使用 SimpleDateFormat 这种更简单的日期格式化工具,通过 pattern 格式化输入字符串。
参考文档:docs.oracle.com/javase/8/do…
针对你给的例子 'January 2, 2010' 使用说明如下:
"January"是月份(英文全称),使用MMMM作为 pattern"2"是当前月份下的日,使用d作为 pattern"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:
PS:这些 patterns 是区分大小写的!
四个字符就可以表示月份的全拼了,不需要在写更多个,以下是一些使用 SimpleDateFormat patterns 的最佳实践:
| 字符串 | pattern |
|---|---|
| 2001.07.04 AD at 12:08:56 PDT | yyyy.MM.dd G 'at' HH:mm:ss z |
| Wed, Jul 4, '01 | EEE, MMM d, ''yy |
| 12:08 PM | h:mm a |
| 12 o'clock PM, Pacific Daylight Time | hh 'o''clock' a, zzzz |
| 0:08 PM, PDT | K:mm a, z |
| 02001.July.04 AD 12:08 PM | yyyyy.MMMM.dd GGG hh:mm aaa |
| Wed, 4 Jul 2001 12:08:56 -0700 | EEE, d MMM yyyy HH:mm:ss Z |
| 010704120856-0700 | yyMMddHHmmssZ |
| 2001-07-04T12:08:56.235-0700 | yyyy-MM-dd'T'HH:mm:ss.SSSZ |
| 2001-07-04T12:08:56.235-07:00 | yyyy-MM-dd'T'HH:mm:ss.SSSXXX |
| 2001-W27-3 | YYYY-'W'ww-u |
!!重要!!
SimpleDateFormat 非线程安全
SimpleDateFormat 非线程安全
SimpleDateFormat 非线程安全
每次使用时切记不要使用静态变量/实例变量,并且保证 SimpleDateFormat 的作用域在本地范围之内。超出本地范围内请创建全新的对象。