如何将String字符串日期转换成Date类型

本文介绍了在Java中如何将String类型的日期字符串转换为Date对象的三种常见方法:使用SimpleDateFormat、利用org.apache.commons.lang3.time.DateUtils库及JDK8以上的DateTimeFormatter。这些方法适用于不同场景,如多线程环境下的日期转换。

场景:尝试从List< Map<String,Object> >【例如从json解析出来的list:List<Map> logList = (List) maps.get("list");】取出其包含Date类型的数据,本以为使用(Date)强转可以转化发现不行,出现如下错误:

java.lang.ClassCastException: java.lang.String cannot be cast to java.util.Date
抛出表示该代码试图将一个对象投射到一个子类,而该子类不是一个实例。

类似的这样强转会出现类似的问题:

Object x = new Integer(0);
System.out.println((String)x);

那怎么才能将String类型转换成我们想要的Date(比如yyyy-MM-dd HH:mm:ss)呢?
方法一:是使用DateFormat,它是一个抽象类,继承它的日期时间格式的子类,如 SimpleDateFormat,允许的格式(例如,日期→文本),分析(文本→日期),和归一化。日期表示为 Date对象或自1970年1月1日00:00:00 GMT毫秒, 建议可以看下JDK文档学习下。
这里举个解决办法的例子:

DateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
o.setAddTime(simpleDateFormat.parse(String.valueOf(o.get("addTime"))));

注意:
SimpleDateFormat是非线层安全的类,阿里巴巴开发手册提示此类一般不要定义为 static 变量如果定义为static,必须加锁。

//每个线程都将拥有自己的SimpleDateFormat对象副本
private static final ThreadLocal<DateFormat> df = new ThreadLocal<DateFormat>() {
	@Override
	protected DateFormat initialValue() {
		return new SimpleDateFormat("yyyy-MM-dd");
	}
};

方法二: 使用org.apache.commons.lang3.time.DateUtils 【推荐使用】

1.通过尝试各种不同的解析器来解析表示日期的字符串,使用给定区域设置的默认日期格式符号。
public static Date parseDate(final String str, final Locale locale, final String... parsePatterns) throws ParseException {
        return parseDateWithLeniency(str, locale, parsePatterns, true);
}
2.通过尝试各种不同的解析器来解析表示日期的字符串
public static Date parseDate(final String str, final String... parsePatterns) throws ParseException {
        return parseDate(str, null, parsePatterns);
}

举例:

Date date = DateUtils.parse("2018-06-16 10:00:00","yyyy-MM-dd HH:mm:ss");

方法三: JDK8以上可以DateTimeFormatter 代替 SimpleDateFormat【DateTimeFormatter是线程安全的】

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
LocalDate date = LocalDate.parse("2018-06-16 10:00:00", formatter);
在 Java 中,将字符串String转换日期Date)可以使用 `SimpleDateFormat` 类,它是 `DateFormat` 的一个具体子类,允许进行日期和文本之间的转换和解析 [^1]。 以下是几种实现方法: ### 方法一:使用 `SimpleDateFormat` 类 ```java import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; public class StringToDateExample { public static Date convert(String s) { Date date = null; SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); try { date = dateFormat.parse(s); } catch (ParseException e) { e.printStackTrace(); } return date; } public static void main(String[] args) { String dateString = "2022-08-26 20:32:26"; Date date = convert(dateString); System.out.println(date); } } ``` ### 方法二:在对象属性赋值时转换 ```java import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.HashMap; import java.util.Map; class ExampleObject { private Date addTime; public void setAddTime(Date addTime) { this.addTime = addTime; } public Object get(String key) { Map<String, Object> map = new HashMap<>(); map.put("addTime", "2022-08-26 20:32:26"); return map.get(key); } public static void main(String[] args) { ExampleObject o = new ExampleObject(); DateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); try { o.setAddTime(simpleDateFormat.parse(String.valueOf(o.get("addTime")))); } catch (ParseException e) { e.printStackTrace(); } } } ``` ### 方法三:处理包含特定格式的字符串 ```java import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Locale; import java.util.regex.Pattern; public class StrToDate { public Date str2Date(String dateString) { String FORMAT_STRING = "yyyy-MM-dd HH:mm:ss"; String[] REPLACE_STRING = new String[]{"GMT+0800", "GMT+08:00"}; String SPLIT_STRING = "(中国标准时间)"; try { dateString = dateString.split(Pattern.quote(SPLIT_STRING))[0].replace(REPLACE_STRING[0], REPLACE_STRING[1]); SimpleDateFormat sf1 = new SimpleDateFormat("E MMM dd yyyy HH:mm:ss z", Locale.US); Date date = sf1.parse(dateString); return date; } catch (Exception e) { throw new RuntimeException("时间化格式错误" + "[dateString=" + dateString + "]" + "[FORMAT_STRING=" + FORMAT_STRING + "]"); } } public static void main(String[] args) { StrToDate converter = new StrToDate(); String dateString = "Fri Aug 26 2022 20:32:26 GMT+0800 (中国标准时间)"; Date date = converter.str2Date(dateString); System.out.println(date); } } ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值