Skip to content

Commit 2169e33

Browse files
authored
Merge pull request #2889 from winlans/v5-dev
fix DateUtil.parseUTC
2 parents db108e1 + b710b83 commit 2169e33

File tree

2 files changed

+49
-4
lines changed

2 files changed

+49
-4
lines changed

hutool-core/src/main/java/cn/hutool/core/date/DateUtil.java

+22
Original file line numberDiff line numberDiff line change
@@ -874,6 +874,7 @@ public static DateTime parseUTC(String utcString) {
874874

875875
if (StrUtil.contains(utcString, CharUtil.DOT)) {
876876
// 带毫秒,格式类似:2018-09-13T05:34:31.999+08:00
877+
utcString = normalizeMillSeconds(utcString, ".", "+");
877878
return parse(utcString, DatePattern.UTC_MS_WITH_XXX_OFFSET_FORMAT);
878879
} else {
879880
// 格式类似:2018-09-13T05:34:31+08:00
@@ -890,6 +891,7 @@ public static DateTime parseUTC(String utcString) {
890891

891892
if (StrUtil.contains(utcString, CharUtil.DOT)) {
892893
// 带毫秒,格式类似:2018-09-13T05:34:31.999-08:00
894+
utcString = normalizeMillSeconds(utcString, ".", "-");
893895
return new DateTime(utcString, DatePattern.UTC_MS_WITH_XXX_OFFSET_FORMAT);
894896
} else {
895897
// 格式类似:2018-09-13T05:34:31-08:00
@@ -904,6 +906,7 @@ public static DateTime parseUTC(String utcString) {
904906
return parse(utcString + ":00", DatePattern.UTC_SIMPLE_FORMAT);
905907
} else if (StrUtil.contains(utcString, CharUtil.DOT)) {
906908
// 可能为: 2021-03-17T06:31:33.99
909+
utcString = normalizeMillSeconds(utcString, ".", null);
907910
return parse(utcString, DatePattern.UTC_SIMPLE_MS_FORMAT);
908911
}
909912
}
@@ -2349,4 +2352,23 @@ private static String normalize(CharSequence dateStr) {
23492352
return builder.toString();
23502353
}
23512354
// ------------------------------------------------------------------------ Private method end
2355+
2356+
/**
2357+
* 如果日期中的毫秒部分超出3位,会导致秒数增加,因此只保留前三位
2358+
*
2359+
* @param dateStr 日期字符串
2360+
* @param before 毫秒部分的前一个字符
2361+
* @param after 毫秒部分的后一个字符
2362+
* @return 规范之后的毫秒部分
2363+
*/
2364+
private static String normalizeMillSeconds(String dateStr, CharSequence before, CharSequence after) {
2365+
if (StrUtil.isBlank(after)) {
2366+
String millOrNaco = StrUtil.subPre(StrUtil.subAfter(dateStr, before, true), 3);
2367+
return StrUtil.subBefore(dateStr, before, true) + before + millOrNaco;
2368+
}
2369+
String millOrNaco = StrUtil.subPre(StrUtil.subBetween(dateStr, before, after), 3);
2370+
return StrUtil.subBefore(dateStr, before, true)
2371+
+ before
2372+
+ millOrNaco + after + StrUtil.subAfter(dateStr, after, true);
2373+
}
23522374
}

hutool-core/src/test/java/cn/hutool/core/date/DateUtilTest.java

+27-4
Original file line numberDiff line numberDiff line change
@@ -1101,10 +1101,33 @@ public void isInTest(){
11011101
}
11021102

11031103
@Test
1104-
public void isLastDayTest(){
1104+
public void isLastDayTest() {
11051105
DateTime dateTime = DateUtil.parse("2022-09-30");
1106-
int dayOfMonth = DateUtil.getLastDayOfMonth(dateTime);
1107-
Assert.assertEquals(dayOfMonth,dateTime.dayOfMonth());
1108-
Assert.assertTrue("not is last day of this month !!",DateUtil.isLastDayOfMonth(dateTime));
1106+
int dayOfMonth = DateUtil.getLastDayOfMonth(dateTime);
1107+
Assert.assertEquals(dayOfMonth, dateTime.dayOfMonth());
1108+
Assert.assertTrue("not is last day of this month !!", DateUtil.isLastDayOfMonth(dateTime));
11091109
}
1110+
1111+
1112+
/**
1113+
* issue#2887 由于UTC时间的毫秒部分超出3位导致的秒数增加的问题
1114+
*/
1115+
@Test
1116+
public void parseUTCTest4() {
1117+
final String dateStr = "2023-02-07T00:02:16.12345+08:00";
1118+
final DateTime dateTime = DateUtil.parse(dateStr);
1119+
Assert.assertNotNull(dateTime);
1120+
Assert.assertEquals("2023-02-07 00:02:16", dateTime.toString());
1121+
1122+
final String dateStr2 = "2023-02-07T00:02:16.12345-08:00";
1123+
final DateTime dateTime2 = DateUtil.parse(dateStr2);
1124+
Assert.assertNotNull(dateTime2);
1125+
Assert.assertEquals("2023-02-07 00:02:16", dateTime2.toString());
1126+
1127+
final String dateStr3 = "2021-03-17T06:31:33.9999";
1128+
final DateTime dateTime3 = DateUtil.parse(dateStr3);
1129+
Assert.assertNotNull(dateTime3);
1130+
Assert.assertEquals("2021-03-17 06:31:33", dateTime3.toString());
1131+
}
1132+
11101133
}

0 commit comments

Comments
 (0)