mirror of
https://gitee.com/dromara/hutool.git
synced 2025-05-04 12:47:59 +08:00
enhance parseUTC
This commit is contained in:
parent
69b981e8c0
commit
72af4101bc
@ -13,6 +13,7 @@
|
|||||||
* 【core 】 增加JNDIUtil(issue#1727@Github)
|
* 【core 】 增加JNDIUtil(issue#1727@Github)
|
||||||
* 【core 】 SpringUtil增加unregisterBean方法(pr#388@Gitee)
|
* 【core 】 SpringUtil增加unregisterBean方法(pr#388@Gitee)
|
||||||
* 【core 】 优化TextSimilarity公共子串算法(issue#I42A6V@Gitee)
|
* 【core 】 优化TextSimilarity公共子串算法(issue#I42A6V@Gitee)
|
||||||
|
* 【core 】 优化DateUtil.parse对UTC附带时区字符串解析(issue#I437AP@Gitee)
|
||||||
|
|
||||||
### 🐞Bug修复
|
### 🐞Bug修复
|
||||||
* 【jwt 】 修复JWTUtil中几个方法非static的问题(issue#1735@Github)
|
* 【jwt 】 修复JWTUtil中几个方法非static的问题(issue#1735@Github)
|
||||||
|
@ -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"));
|
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'
|
* 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"));
|
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} 赋予默认时区和位置信息,默认值为系统默认值。
|
* 创建并为 {@link DateTimeFormatter} 赋予默认时区和位置信息,默认值为系统默认值。
|
||||||
*
|
*
|
||||||
|
@ -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:ss.SSS'Z'</li>
|
||||||
* <li>yyyy-MM-dd'T'HH:mm:ssZ</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.SSSZ</li>
|
||||||
|
* <li>yyyy-MM-dd'T'HH:mm:ss+0800</li>
|
||||||
|
* <li>yyyy-MM-dd'T'HH:mm:ss+08:00</li>
|
||||||
* </ol>
|
* </ol>
|
||||||
*
|
*
|
||||||
* @param utcString UTC时间
|
* @param utcString UTC时间
|
||||||
@ -832,14 +834,28 @@ public class DateUtil extends CalendarUtil {
|
|||||||
if (length <= patternLength - 4 && length >= patternLength - 6) {
|
if (length <= patternLength - 4 && length >= patternLength - 6) {
|
||||||
return parse(utcString, DatePattern.UTC_MS_FORMAT);
|
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 {
|
} else {
|
||||||
if (length == DatePattern.UTC_WITH_ZONE_OFFSET_PATTERN.length() + 2 || length == DatePattern.UTC_WITH_ZONE_OFFSET_PATTERN.length() + 3) {
|
if (length == DatePattern.UTC_SIMPLE_PATTERN.length() - 2) {
|
||||||
// 格式类似: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) {
|
|
||||||
// 格式类似:2018-09-13T05:34:31
|
// 格式类似:2018-09-13T05:34:31
|
||||||
return parse(utcString, DatePattern.UTC_SIMPLE_FORMAT);
|
return parse(utcString, DatePattern.UTC_SIMPLE_FORMAT);
|
||||||
} else if (StrUtil.contains(utcString, CharUtil.DOT)) {
|
} else if (StrUtil.contains(utcString, CharUtil.DOT)) {
|
||||||
|
@ -438,7 +438,13 @@ public class DateUtilTest {
|
|||||||
@Test
|
@Test
|
||||||
public void parseTest7() {
|
public void parseTest7() {
|
||||||
String str = "2019-06-01T19:45:43.000 +0800";
|
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());
|
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());
|
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
|
@Test
|
||||||
public void parseAndOffsetTest() {
|
public void parseAndOffsetTest() {
|
||||||
// 检查UTC时间偏移是否准确
|
// 检查UTC时间偏移是否准确
|
||||||
|
@ -29,6 +29,12 @@ public class LocalDateTimeUtilTest {
|
|||||||
Assert.assertEquals(dateStr, of.toString());
|
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
|
@Test
|
||||||
public void parseTest() {
|
public void parseTest() {
|
||||||
final LocalDateTime localDateTime = LocalDateTimeUtil.parse("2020-01-23T12:23:56", DateTimeFormatter.ISO_DATE_TIME);
|
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);
|
final LocalDateTime endOfDay = LocalDateTimeUtil.endOfDay(localDateTime);
|
||||||
Assert.assertEquals("2020-01-23T23:59:59.999999999", endOfDay.toString());
|
Assert.assertEquals("2020-01-23T23:59:59.999999999", endOfDay.toString());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user