如何把各种各样的日期格式转为Date()

618 阅读6分钟

工作中总是和Date打交道、免不了各种日期装换、本文总结一下各种日期格式是如何转换为Date;

Date代码结构

方法都过期了、能用的没几个了 image.png

构造方法构造Date

Date date = new Date(1562501898000L)
Date date = new Date()

Sun Jul 07 20:18:18 CST 2019
Thu Jun 02 21:47:26 CST 2022

Calendar方式获取Date

Date date = Calendar.getInstance().getTime()

Thu Jun 02 21:47:26 CST 2022

时间戳转换为Date

Date date = new Timestamp(1562501898000L);
Date date = new Date(new Timestamp(1562501898000L).getTime())

2019-07-07 20:18:18.0
Sun Jul 07 20:18:18 CST 2019

Instant 转 Date

An instantaneous point on the time-line. 中文描述就是Instant表示高精度时间戳

// 不管哪个时区时间戳唯一、所以都会把时间戳转换为对应时区的时间
Date.from(Instant.ofEpochMilli(1562501898888L)));           //Sun Jul 07 20:18:18 CST 2019
Date.from(Instant.ofEpochSecond(1562501898,888)));          //Sun Jul 07 20:18:18 CST 2019
Date.from(Instant.ofEpochSecond(1562501898)));              //Sun Jul 07 20:18:18 CST 2019
// 如果把日期解析为Instant、会把日期视为0时区时间、解析成对应的Instant后、在当前时区显示会做时区转换、所以多了8小时
Date.from(Instant.parse("2019-07-07T20:18:18.000000888Z")));//Mon Jul 08 04:18:18
Date.from(Instant.parse("2019-07-07T20:18:18Z")));          //Mon Jul 08 04:18:18 CST 2019

ZONED_DATE_TIME 转 Date

ZonedDateTime ZONED_DATE_TIME = ZonedDateTime.of(2019, 7, 7, 20, 18, 18, 888, ZoneId.of("Asia/Tokyo"));
//  东9区时间到东8区时间转换会减去一个小时
Date.from(ZONED_DATE_TIME.toInstant()));  //Sun Jul 07 19:18:18 CST 2019 

OFFSET_DATE_TIME 转 Date

OffsetDateTime OFFSET_DATE_TIME = OffsetDateTime.of(2019, 7, 7, 20, 18, 18, 888, ZoneOffset.ofHours(9));
// 东9区时间到东8区时间转换会减去一个小时
Date.from(OFFSET_DATE_TIME.toInstant()));  //Sun Jul 07 19:18:18 CST 2019

LOCAL_DATE_TIME 转 Date (时区转换这里是个中转器)

LocalDateTime LOCAL_DATE_TIME = LocalDateTime.of(2019, 7, 7, 20, 18, 18, 888);
// 把LocalDateTime视为0时区的时间、转为Instant再转到东8时区、所以会加8小时
Date.from(LOCAL_DATE_TIME.toInstant(ZoneOffset.UTC)));          //Mon Jul 08 04:18:18 CST 2019
// 把LocalDateTime视为东8时区的时间、转为Instant再转到东8时区、所以时间不会变
Date.from(LOCAL_DATE_TIME.toInstant(ZoneOffset.ofHours(8))));   //Sun Jul 07 20:18:18 CST 2019

String转Date

方式一 、SimpleDateFormat不推荐

DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println("格式化器用的时区是:" + dateFormat.getTimeZone().getID() + ":" + dateFormat.parse("2019-07-07 20:18:18"));
dateFormat.setTimeZone(TimeZone.getTimeZone("Asia/Tokyo"));
System.out.println("格式化器用的时区是:" + dateFormat.getTimeZone().getID() + ":" + dateFormat.parse("2019-07-07 20:18:18"));

格式化器用的时区是:Asia/Shanghai:Sun Jul 07 20:18:18 CST 2019   // 相同时区直接转换为Date
格式化器用的时区是:Asia/Tokyo:Sun Jul 07 19:18:18 CST 2019      // 把传入的时间当成日本时间、所以Date会少一个小时、因为中国比日本慢一个小时    

方式2、DateUtils的共通方法

DateUtils.parseDate("2019-07-32 20:18:18 +0800","yyyy-MM-dd HH:mm:ss Z"));         // 不合理日期会自动换算
DateUtils.parseDateStrictly("2019-07-07 20:18:18 +0800","yyyy-MM-dd HH:mm:ss Z")); // 不合理日期直接报错
DateUtils.parseDate("2019-7-07 20:18:18.888 +0800","yyyy-MM-dd HH:mm:ss.SSS Z"));
DateUtils.parseDate("2019-7-07 20:18:18 +0800","yyyy-MM-dd HH:mm:ss Z"));
DateUtils.parseDate("2019-7-07 20:18:18.888","yyyy-MM-dd HH:mm:ss.SSS"));
DateUtils.parseDate("2019-7-07 20:18:18","yyyy-MM-dd HH:mm:ss"));
DateUtils.parseDate("2019-7-07 20:18","yyyy-MM-dd HH:mm"));
DateUtils.parseDate("2019-7-07 20","yyyy-MM-dd HH"));
DateUtils.parseDate("2019-7-07","yyyy-MM-dd"));
DateUtils.parseDate("2019-7","yyyy-MM"));
DateUtils.parseDate("2019","yyyy"));

Sun Jul 07 20:18:18 CST 2019
Sun Jul 07 20:18:18 CST 2019
Sun Jul 07 20:18:18 CST 2019
Sun Jul 07 20:18:18 CST 2019
Sun Jul 07 20:18:00 CST 2019
Sun Jul 07 20:00:00 CST 2019
Sun Jul 07 00:00:00 CST 2019
Mon Jul 01 00:00:00 CST 2019
Tue Jan 01 00:00:00 CST 2019
DateUtils.parseDate("2019/7/07 20:18:18.888 +0800","yyyy/MM/dd HH:mm:ss.SSS Z"));
DateUtils.parseDate("2019/7/07 20:18:18 +0800","yyyy/MM/dd HH:mm:ss Z"));
DateUtils.parseDate("2019/7/07 20:18:18.888","yyyy/MM/dd HH:mm:ss.SSS"));
DateUtils.parseDate("2019/7/07 20:18:18","yyyy/MM/dd HH:mm:ss"));
DateUtils.parseDate("2019/7/07 20:18","yyyy/MM/dd HH:mm"));
DateUtils.parseDate("2019/7/07 20","yyyy/MM/dd HH"));
DateUtils.parseDate("2019/7/07","yyyy/MM/dd"));
DateUtils.parseDate("2019/7","yyyy/MM"));
DateUtils.parseDate("2019","yyyy"));

Sun Jul 07 20:18:18 CST 2019
Sun Jul 07 20:18:18 CST 2019
Sun Jul 07 20:18:18 CST 2019
Sun Jul 07 20:18:18 CST 2019
Sun Jul 07 20:18:00 CST 2019
Sun Jul 07 20:00:00 CST 2019
Sun Jul 07 00:00:00 CST 2019
Mon Jul 01 00:00:00 CST 2019
Tue Jan 01 00:00:00 CST 2019
DateUtils.parseDate("20190707 20:18:18.888 +0800","yyyyMMdd HH:mm:ss.SSS Z"));
DateUtils.parseDate("20190707 20:18:18 +0800","yyyyMMdd HH:mm:ss Z"));
DateUtils.parseDate("20190707 20:18:18.888","yyyyMMdd HH:mm:ss.SSS"));
DateUtils.parseDate("20190707 20:18:18","yyyyMMdd HH:mm:ss"));
DateUtils.parseDate("20190707 20:18","yyyyMMdd HH:mm"));
DateUtils.parseDate("20190707 20","yyyyMMdd HH"));
DateUtils.parseDate("20190707","yyyyMMdd"));
DateUtils.parseDate("201907","yyyyMM"));
DateUtils.parseDate("2019","yyyy"));

Sun Jul 07 20:18:18 CST 2019
Sun Jul 07 20:18:18 CST 2019
Sun Jul 07 20:18:18 CST 2019
Sun Jul 07 20:18:18 CST 2019
Sun Jul 07 20:18:00 CST 2019
Sun Jul 07 20:00:00 CST 2019
Sun Jul 07 00:00:00 CST 2019
Mon Jul 01 00:00:00 CST 2019
Tue Jan 01 00:00:00 CST 2019