新增RFC2822日期格式解析支持

This commit is contained in:
Looly 2024-03-28 23:19:17 +08:00
parent 94b28801a3
commit 339b8869ad
4 changed files with 32 additions and 11 deletions

View File

@ -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

View File

@ -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

View File

@ -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时间格式<br>
* <ol>
* <li>EEE MMM dd HH:mm:ss z yyyy例如Wed Aug 01 00:00:00 CST 2012</li>
* </ol>
*
* @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);

View File

@ -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);