diff --git a/CHANGELOG.md b/CHANGELOG.md index 3b2d8b479..377f7e4ce 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ * 【core 】 FileUtil和PathUtil增加Resource重载(issue#I97FJT@Gitee) * 【core 】 优化ThreadUtil.safeSleep,使用System.nanoTime()(issue#I9BMGK@Gitee) * 【db 】 新增数据库Wrapper支持反解(pr#1192@Gitee) +* 【core 】 新增RFC2822日期格式解析支持(issue#I9C2D4@Gitee) ### 🐞Bug修复 * 【core 】 修复PathMover对目标已存在且只读文件报错错误问题(issue#I95CLT@Gitee) diff --git a/hutool-core/src/main/java/cn/hutool/core/date/DatePattern.java b/hutool-core/src/main/java/cn/hutool/core/date/DatePattern.java index a499c9e7d..4e4640040 100644 --- a/hutool-core/src/main/java/cn/hutool/core/date/DatePattern.java +++ b/hutool-core/src/main/java/cn/hutool/core/date/DatePattern.java @@ -226,6 +226,10 @@ public class DatePattern { * HTTP头中日期时间格式 {@link FastDateFormat}:EEE, dd MMM yyyy HH:mm:ss z */ public static final FastDateFormat HTTP_DATETIME_FORMAT = FastDateFormat.getInstance(HTTP_DATETIME_PATTERN, TimeZone.getTimeZone("GMT"), Locale.US); + /** + * HTTP头中日期时间格式 {@link FastDateFormat}:EEE, dd MMM yyyy HH:mm:ss z + */ + public static final FastDateFormat HTTP_DATETIME_FORMAT_Z = FastDateFormat.getInstance(HTTP_DATETIME_PATTERN, Locale.US); /** * JDK中日期时间格式:EEE MMM dd HH:mm:ss zzz yyyy diff --git a/hutool-core/src/main/java/cn/hutool/core/date/DateUtil.java b/hutool-core/src/main/java/cn/hutool/core/date/DateUtil.java index d20b8881d..0abdef071 100755 --- a/hutool-core/src/main/java/cn/hutool/core/date/DateUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/date/DateUtil.java @@ -927,24 +927,40 @@ public class DateUtil extends CalendarUtil { * @param cstString UTC时间 * @return 日期对象 * @since 4.6.9 + * @deprecated 理解错误,请使用{@link #parseRFC2822(CharSequence)} */ + @Deprecated public static DateTime parseCST(CharSequence cstString) { - if (cstString == null) { + return parseRFC2822(cstString); + } + + /** + * 解析RFC2822时间,格式:
+ *
    + *
  1. EEE MMM dd HH:mm:ss z yyyy(例如:Wed Aug 01 00:00:00 CST 2012)
  2. + *
+ * + * @param source RFC2822时间 + * @return 日期对象 + * @since 4.6.9 + */ + public static DateTime parseRFC2822(CharSequence source) { + if (source == null) { return null; } // issue#I9C2D4 - if(StrUtil.contains(cstString, ',')){ - if(StrUtil.contains(cstString, "星期")){ - return parse(cstString, FastDateFormat.getInstance(DatePattern.HTTP_DATETIME_PATTERN, TimeZone.getTimeZone("GMT"), Locale.CHINA)); + if(StrUtil.contains(source, ',')){ + if(StrUtil.contains(source, "星期")){ + return parse(source, FastDateFormat.getInstance(DatePattern.HTTP_DATETIME_PATTERN, Locale.CHINA)); } - return parse(cstString, DatePattern.HTTP_DATETIME_FORMAT); + return parse(source, DatePattern.HTTP_DATETIME_FORMAT_Z); } - if(StrUtil.contains(cstString, "星期")){ - return parse(cstString, FastDateFormat.getInstance(DatePattern.JDK_DATETIME_PATTERN, TimeZone.getTimeZone("GMT"), Locale.CHINA)); + if(StrUtil.contains(source, "星期")){ + return parse(source, FastDateFormat.getInstance(DatePattern.JDK_DATETIME_PATTERN, Locale.CHINA)); } - return parse(cstString, DatePattern.JDK_DATETIME_FORMAT); + return parse(source, DatePattern.JDK_DATETIME_FORMAT); } /** @@ -1007,7 +1023,7 @@ public class DateUtil extends CalendarUtil { // Tue Jun 4 16:25:15 +0800 2019 // Thu May 16 17:57:18 GMT+08:00 2019 // Wed Aug 01 00:00:00 CST 2012 - return parseCST(dateStr); + return parseRFC2822(dateStr); } else if (StrUtil.contains(dateStr, 'T')) { // UTC时间 return parseUTC(dateStr); diff --git a/hutool-core/src/test/java/cn/hutool/core/date/DateUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/date/DateUtilTest.java index 02c72ae41..1f75a082c 100755 --- a/hutool-core/src/test/java/cn/hutool/core/date/DateUtilTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/date/DateUtilTest.java @@ -705,7 +705,7 @@ public class DateUtilTest { } @Test - public void parseCSTTest() { + public void parseRFC2822Test() { final String dateStr = "Wed Sep 16 11:26:23 CST 2009"; final SimpleDateFormat sdf = new SimpleDateFormat(DatePattern.JDK_DATETIME_PATTERN, Locale.US); @@ -713,7 +713,7 @@ public class DateUtilTest { sdf.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai")); final DateTime parse = DateUtil.parse(dateStr, sdf); - DateTime dateTime = DateUtil.parseCST(dateStr); + DateTime dateTime = DateUtil.parseRFC2822(dateStr); Assert.assertEquals(parse, dateTime); dateTime = DateUtil.parse(dateStr);