enhance parseUTC

This commit is contained in:
Looly 2021-08-02 13:41:54 +08:00
parent 69b981e8c0
commit 72af4101bc
5 changed files with 70 additions and 9 deletions

View File

@ -13,6 +13,7 @@
* 【core 】 增加JNDIUtilissue#1727@Github
* 【core 】 SpringUtil增加unregisterBean方法pr#388@Gitee
* 【core 】 优化TextSimilarity公共子串算法issue#I42A6V@Gitee
* 【core 】 优化DateUtil.parse对UTC附带时区字符串解析issue#I437AP@Gitee
### 🐞Bug修复
* 【jwt 】 修复JWTUtil中几个方法非static的问题issue#1735@Github

View File

@ -267,6 +267,15 @@ public class DatePattern {
*/
public static final FastDateFormat UTC_WITH_ZONE_OFFSET_FORMAT = FastDateFormat.getInstance(UTC_WITH_ZONE_OFFSET_PATTERN, TimeZone.getTimeZone("UTC"));
/**
* UTC时间yyyy-MM-dd'T'HH:mm:ssXXX
*/
public static final String UTC_WITH_XXX_OFFSET_PATTERN = "yyyy-MM-dd'T'HH:mm:ssXXX";
/**
* UTC时间{@link FastDateFormat}yyyy-MM-dd'T'HH:mm:ssXXX
*/
public static final FastDateFormat UTC_WITH_XXX_OFFSET_FORMAT = FastDateFormat.getInstance(UTC_WITH_XXX_OFFSET_PATTERN);
/**
* UTC时间yyyy-MM-dd'T'HH:mm:ss.SSS'Z'
*/
@ -285,6 +294,15 @@ public class DatePattern {
*/
public static final FastDateFormat UTC_MS_WITH_ZONE_OFFSET_FORMAT = FastDateFormat.getInstance(UTC_MS_WITH_ZONE_OFFSET_PATTERN, TimeZone.getTimeZone("UTC"));
/**
* UTC时间yyyy-MM-dd'T'HH:mm:ss.SSSXXX
*/
public static final String UTC_MS_WITH_XXX_OFFSET_PATTERN = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX";
/**
* UTC时间{@link FastDateFormat}yyyy-MM-dd'T'HH:mm:ss.SSSXXX
*/
public static final FastDateFormat UTC_MS_WITH_XXX_OFFSET_FORMAT = FastDateFormat.getInstance(UTC_MS_WITH_XXX_OFFSET_PATTERN);
/**
* 创建并为 {@link DateTimeFormatter} 赋予默认时区和位置信息默认值为系统默认值
*

View File

@ -809,6 +809,8 @@ public class DateUtil extends CalendarUtil {
* <li>yyyy-MM-dd'T'HH:mm:ss.SSS'Z'</li>
* <li>yyyy-MM-dd'T'HH:mm:ssZ</li>
* <li>yyyy-MM-dd'T'HH:mm:ss.SSSZ</li>
* <li>yyyy-MM-dd'T'HH:mm:ss+0800</li>
* <li>yyyy-MM-dd'T'HH:mm:ss+08:00</li>
* </ol>
*
* @param utcString UTC时间
@ -832,14 +834,28 @@ public class DateUtil extends CalendarUtil {
if (length <= patternLength - 4 && length >= patternLength - 6) {
return parse(utcString, DatePattern.UTC_MS_FORMAT);
}
} else if(StrUtil.contains(utcString, '+')){
// 去除类似2019-06-01T19:45:43 +08:00加号前的空格
utcString = utcString.replace(" +", "+");
final String zoneOffset = StrUtil.subAfter(utcString, '+', true);
if(StrUtil.isBlank(zoneOffset)){
throw new DateException("Invalid format: [{}]", utcString);
}
if(false == StrUtil.contains(zoneOffset, ':')){
// +0800转换为+08:00
final String pre = StrUtil.subBefore(utcString, '+', true);
utcString = pre + "+" + zoneOffset.substring(0, 2) + ":" + "00";
}
if(StrUtil.contains(utcString, CharUtil.DOT)) {
// 带毫秒格式类似2018-09-13T05:34:31.999+08:00
return parse(utcString, DatePattern.UTC_MS_WITH_XXX_OFFSET_FORMAT);
} else {
// 格式类似2018-09-13T05:34:31+08:00
return parse(utcString, DatePattern.UTC_WITH_XXX_OFFSET_FORMAT);
}
} else {
if (length == DatePattern.UTC_WITH_ZONE_OFFSET_PATTERN.length() + 2 || length == DatePattern.UTC_WITH_ZONE_OFFSET_PATTERN.length() + 3) {
// 格式类似2018-09-13T05:34:31+0800 2018-09-13T05:34:31+08:00
return parse(utcString, DatePattern.UTC_WITH_ZONE_OFFSET_FORMAT);
} else if (length == DatePattern.UTC_MS_WITH_ZONE_OFFSET_PATTERN.length() + 2 || length == DatePattern.UTC_MS_WITH_ZONE_OFFSET_PATTERN.length() + 3) {
// 格式类似2018-09-13T05:34:31.999+0800 2018-09-13T05:34:31.999+08:00
return parse(utcString, DatePattern.UTC_MS_WITH_ZONE_OFFSET_FORMAT);
} else if (length == DatePattern.UTC_SIMPLE_PATTERN.length() - 2) {
if (length == DatePattern.UTC_SIMPLE_PATTERN.length() - 2) {
// 格式类似2018-09-13T05:34:31
return parse(utcString, DatePattern.UTC_SIMPLE_FORMAT);
} else if (StrUtil.contains(utcString, CharUtil.DOT)) {

View File

@ -438,7 +438,13 @@ public class DateUtilTest {
@Test
public void parseTest7() {
String str = "2019-06-01T19:45:43.000 +0800";
DateTime dateTime = DateUtil.parse(str, "yyyy-MM-dd'T'HH:mm:ss.SSS Z");
DateTime dateTime = DateUtil.parse(str);
assert dateTime != null;
Assert.assertEquals("2019-06-01 19:45:43", dateTime.toString());
str = "2019-06-01T19:45:43 +08:00";
dateTime = DateUtil.parse(str);
assert dateTime != null;
Assert.assertEquals("2019-06-01 19:45:43", dateTime.toString());
}
@ -450,6 +456,20 @@ public class DateUtilTest {
Assert.assertEquals("2020-06-28 02:14:13", dateTime.toString());
}
@Test
public void parseUTCOffsetTest() {
// issue#I437AP@Gitee
String str = "2019-06-01T19:45:43+08:00";
DateTime dateTime = DateUtil.parse(str);
assert dateTime != null;
Assert.assertEquals("2019-06-01 19:45:43", dateTime.toString());
str = "2019-06-01T19:45:43 +08:00";
dateTime = DateUtil.parse(str);
assert dateTime != null;
Assert.assertEquals("2019-06-01 19:45:43", dateTime.toString());
}
@Test
public void parseAndOffsetTest() {
// 检查UTC时间偏移是否准确

View File

@ -29,6 +29,12 @@ public class LocalDateTimeUtilTest {
Assert.assertEquals(dateStr, of.toString());
}
@Test
public void parseOffsetTest() {
final LocalDateTime localDateTime = LocalDateTimeUtil.parse("2021-07-30T16:27:27+08:00", DateTimeFormatter.ISO_OFFSET_DATE_TIME);
Assert.assertEquals("2021-07-30T16:27:27", localDateTime.toString());
}
@Test
public void parseTest() {
final LocalDateTime localDateTime = LocalDateTimeUtil.parse("2020-01-23T12:23:56", DateTimeFormatter.ISO_DATE_TIME);
@ -137,4 +143,4 @@ public class LocalDateTimeUtilTest {
final LocalDateTime endOfDay = LocalDateTimeUtil.endOfDay(localDateTime);
Assert.assertEquals("2020-01-23T23:59:59.999999999", endOfDay.toString());
}
}
}