fix date chinese bug

This commit is contained in:
looly 2021-12-01 16:44:05 +08:00
parent 83108c712d
commit a7fde0338b
4 changed files with 89 additions and 39 deletions

View File

@ -40,6 +40,7 @@
* 【poi 】 修复读取日期类型的自定义样式单元格时间结果为1899年问题pr#1977@Github * 【poi 】 修复读取日期类型的自定义样式单元格时间结果为1899年问题pr#1977@Github
* 【poi 】 修复SoapClient参数未使用问题 * 【poi 】 修复SoapClient参数未使用问题
* 【core 】 修复HashUtil.cityHash128参数未使用问题 * 【core 】 修复HashUtil.cityHash128参数未使用问题
* 【core 】 修复DateUtil.formatChineseDate显示问题issue#I4KK5F@Gitee
------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------

View File

@ -64,7 +64,7 @@ public class NumberChineseFormatter {
return ""; return "";
} }
Assert.checkBetween(amount, -99_9999_9999_9999.99, 99_9999_9999_9999.99, Assert.checkBetween(amount, -99_9999_9999_9999.99, 99_9999_9999_9999.99,
"Number support only: (-99999999999999.99 99999999999999.99)"); "Number support only: (-99999999999999.99 ~ 99999999999999.99)");
final StringBuilder chineseStr = new StringBuilder(); final StringBuilder chineseStr = new StringBuilder();
@ -126,6 +126,52 @@ public class NumberChineseFormatter {
return chineseStr.toString(); return chineseStr.toString();
} }
/**
* 阿拉伯数字支持正负整数转换成中文
*
* @param amount 数字
* @param isUseTraditional 是否使用繁体
* @return 中文
* @since 5.7.17
*/
public static String format(long amount, boolean isUseTraditional){
if(0 == amount){
return "";
}
Assert.checkBetween(amount, -99_9999_9999_9999.99, 99_9999_9999_9999.99,
"Number support only: (-99999999999999.99 ~ 99999999999999.99)");
final StringBuilder chineseStr = new StringBuilder();
// 负数
if (amount < 0) {
chineseStr.append("");
amount = -amount;
}
chineseStr.append(longToChinese(amount, isUseTraditional));
return chineseStr.toString();
}
/**
* 格式化-999~999之间的数字<br>
* 这个方法显示10~19以下的数字时使用"十一"而非"一十一"
*
* @param amount 数字
* @param isUseTraditional 是否使用繁体
* @return 中文
* @since 5.7.17
*/
public static String formatThousand(int amount, boolean isUseTraditional){
Assert.checkBetween(amount, -999, 999, "Number support only: (-999 ~ 999)");
final String chinese = thousandToChinese(amount, isUseTraditional);
if(amount < 20 && amount > 10){
// "十一"而非"一十一"
return chinese.substring(1);
}
return chinese;
}
/** /**
* 数字字符转中文非数字字符原样返回 * 数字字符转中文非数字字符原样返回
* *

View File

@ -525,8 +525,8 @@ public class CalendarUtil {
* 将指定Calendar时间格式化为纯中文形式比如 * 将指定Calendar时间格式化为纯中文形式比如
* *
* <pre> * <pre>
* 2018-02-24 12:13:14转换为 一八年二月二十四日withTime为false * 2018-02-24 12:13:14 转换为 一八年二月二十四日withTime为false
* 2018-02-24 12:13:14 转换为 一八年二月二十四日十二时十三分十四秒withTime为true * 2018-02-24 12:13:14 转换为 一八年二月二十四日十二时十三分十四秒withTime为true
* </pre> * </pre>
* *
* @param calendar {@link Calendar} * @param calendar {@link Calendar}
@ -538,7 +538,7 @@ public class CalendarUtil {
final StringBuilder result = StrUtil.builder(); final StringBuilder result = StrUtil.builder();
// //
String year = String.valueOf(calendar.get(Calendar.YEAR)); final String year = String.valueOf(calendar.get(Calendar.YEAR));
final int length = year.length(); final int length = year.length();
for (int i = 0; i < length; i++) { for (int i = 0; i < length; i++) {
result.append(NumberChineseFormatter.numberCharToChinese(year.charAt(i), false)); result.append(NumberChineseFormatter.numberCharToChinese(year.charAt(i), false));
@ -547,26 +547,26 @@ public class CalendarUtil {
// //
int month = calendar.get(Calendar.MONTH) + 1; int month = calendar.get(Calendar.MONTH) + 1;
result.append(NumberChineseFormatter.format(month, false)); result.append(NumberChineseFormatter.formatThousand(month, false));
result.append('月'); result.append('月');
// //
int day = calendar.get(Calendar.DAY_OF_MONTH); int day = calendar.get(Calendar.DAY_OF_MONTH);
result.append(NumberChineseFormatter.format(day, false)); result.append(NumberChineseFormatter.formatThousand(day, false));
result.append('日'); result.append('日');
if (withTime) { if (withTime) {
// //
int hour = calendar.get(Calendar.HOUR_OF_DAY); int hour = calendar.get(Calendar.HOUR_OF_DAY);
result.append(NumberChineseFormatter.format(hour, false)); result.append(NumberChineseFormatter.formatThousand(hour, false));
result.append('时'); result.append('时');
// //
int minute = calendar.get(Calendar.MINUTE); int minute = calendar.get(Calendar.MINUTE);
result.append(NumberChineseFormatter.format(minute, false)); result.append(NumberChineseFormatter.formatThousand(minute, false));
result.append('分'); result.append('分');
// //
int second = calendar.get(Calendar.SECOND); int second = calendar.get(Calendar.SECOND);
result.append(NumberChineseFormatter.format(second, false)); result.append(NumberChineseFormatter.formatThousand(second, false));
result.append('秒'); result.append('秒');
} }

View File

@ -116,7 +116,7 @@ public class DateUtilTest {
} }
@Test @Test
public void truncateTest(){ public void truncateTest() {
String dateStr2 = "2020-02-29 12:59:34"; String dateStr2 = "2020-02-29 12:59:34";
Date date2 = DateUtil.parse(dateStr2); Date date2 = DateUtil.parse(dateStr2);
final DateTime dateTime = DateUtil.truncate(date2, DateField.MINUTE); final DateTime dateTime = DateUtil.truncate(date2, DateField.MINUTE);
@ -124,7 +124,7 @@ public class DateUtilTest {
} }
@Test @Test
public void ceilingMinuteTest(){ public void ceilingMinuteTest() {
String dateStr2 = "2020-02-29 12:59:34"; String dateStr2 = "2020-02-29 12:59:34";
Date date2 = DateUtil.parse(dateStr2); Date date2 = DateUtil.parse(dateStr2);
@ -137,7 +137,7 @@ public class DateUtilTest {
} }
@Test @Test
public void ceilingDayTest(){ public void ceilingDayTest() {
String dateStr2 = "2020-02-29 12:59:34"; String dateStr2 = "2020-02-29 12:59:34";
Date date2 = DateUtil.parse(dateStr2); Date date2 = DateUtil.parse(dateStr2);
@ -279,13 +279,16 @@ public class DateUtilTest {
public void formatChineseDateTest() { public void formatChineseDateTest() {
String formatChineseDate = DateUtil.formatChineseDate(DateUtil.parse("2018-02-24"), true, false); String formatChineseDate = DateUtil.formatChineseDate(DateUtil.parse("2018-02-24"), true, false);
Assert.assertEquals("二〇一八年二月二十四日", formatChineseDate); Assert.assertEquals("二〇一八年二月二十四日", formatChineseDate);
formatChineseDate = DateUtil.formatChineseDate(DateUtil.parse("2018-02-14"), true, false);
Assert.assertEquals("二〇一八年二月十四日", formatChineseDate);
} }
@Test @Test
public void formatChineseDateTimeTest() { public void formatChineseDateTimeTest() {
String formatChineseDateTime = DateUtil.formatChineseDate(DateUtil.parse("2018-02-24 12:13:14"), true, true); String formatChineseDateTime = DateUtil.formatChineseDate(DateUtil.parse("2018-02-24 12:13:14"), true, true);
Assert.assertEquals("二〇一八年二月二十四日十二时十三分十四秒", formatChineseDateTime); Assert.assertEquals("二〇一八年二月二十四日十二时十三分十四秒", formatChineseDateTime);
} }
@Test @Test
public void formatBetweenTest() { public void formatBetweenTest() {
@ -666,24 +669,24 @@ public class DateUtilTest {
} }
@Test @Test
public void parseUTCTest2(){ public void parseUTCTest2() {
// issue1503@Github // issue1503@Github
// 检查不同毫秒长度都可以正常匹配 // 检查不同毫秒长度都可以正常匹配
String utcTime="2021-03-30T12:56:51.3Z"; String utcTime = "2021-03-30T12:56:51.3Z";
DateTime parse = DateUtil.parseUTC(utcTime); DateTime parse = DateUtil.parseUTC(utcTime);
Assert.assertEquals("2021-03-30 12:56:51", parse.toString()); Assert.assertEquals("2021-03-30 12:56:51", parse.toString());
utcTime="2021-03-30T12:56:51.34Z"; utcTime = "2021-03-30T12:56:51.34Z";
parse = DateUtil.parseUTC(utcTime); parse = DateUtil.parseUTC(utcTime);
Assert.assertEquals("2021-03-30 12:56:51", parse.toString()); Assert.assertEquals("2021-03-30 12:56:51", parse.toString());
utcTime="2021-03-30T12:56:51.345Z"; utcTime = "2021-03-30T12:56:51.345Z";
parse = DateUtil.parseUTC(utcTime); parse = DateUtil.parseUTC(utcTime);
Assert.assertEquals("2021-03-30 12:56:51", parse.toString()); Assert.assertEquals("2021-03-30 12:56:51", parse.toString());
} }
@Test @Test
public void parseCSTTest(){ public void parseCSTTest() {
String dateStr = "Wed Sep 16 11:26:23 CST 2009"; String dateStr = "Wed Sep 16 11:26:23 CST 2009";
SimpleDateFormat sdf = new SimpleDateFormat(DatePattern.JDK_DATETIME_PATTERN, Locale.US); SimpleDateFormat sdf = new SimpleDateFormat(DatePattern.JDK_DATETIME_PATTERN, Locale.US);
@ -697,7 +700,7 @@ public class DateUtilTest {
} }
@Test @Test
public void parseCSTTest2(){ public void parseCSTTest2() {
String dateStr = "Wed Sep 16 11:26:23 CST 2009"; String dateStr = "Wed Sep 16 11:26:23 CST 2009";
SimpleDateFormat sdf = new SimpleDateFormat(DatePattern.JDK_DATETIME_PATTERN, Locale.US); SimpleDateFormat sdf = new SimpleDateFormat(DatePattern.JDK_DATETIME_PATTERN, Locale.US);
@ -737,7 +740,7 @@ public class DateUtilTest {
Date date = DateUtil.endOfQuarter( Date date = DateUtil.endOfQuarter(
DateUtil.parse("2020-05-31 00:00:00")); DateUtil.parse("2020-05-31 00:00:00"));
Assert.assertEquals("2020-06-30 23:59:59", DateUtil.format(date,"yyyy-MM-dd HH:mm:ss")); Assert.assertEquals("2020-06-30 23:59:59", DateUtil.format(date, "yyyy-MM-dd HH:mm:ss"));
} }
@Test @Test
@ -803,7 +806,7 @@ public class DateUtilTest {
} }
@Test @Test
public void toInstantTest(){ public void toInstantTest() {
LocalDateTime localDateTime = LocalDateTime.parse("2017-05-06T08:30:00", DateTimeFormatter.ISO_DATE_TIME); LocalDateTime localDateTime = LocalDateTime.parse("2017-05-06T08:30:00", DateTimeFormatter.ISO_DATE_TIME);
Instant instant = DateUtil.toInstant(localDateTime); Instant instant = DateUtil.toInstant(localDateTime);
Assert.assertEquals("2017-05-06T00:30:00Z", instant.toString()); Assert.assertEquals("2017-05-06T00:30:00Z", instant.toString());
@ -818,7 +821,7 @@ public class DateUtilTest {
} }
@Test @Test
public void dateTest(){ public void dateTest() {
//LocalDateTime ==> date //LocalDateTime ==> date
LocalDateTime localDateTime = LocalDateTime.parse("2017-05-06T08:30:00", DateTimeFormatter.ISO_DATE_TIME); LocalDateTime localDateTime = LocalDateTime.parse("2017-05-06T08:30:00", DateTimeFormatter.ISO_DATE_TIME);
DateTime date = DateUtil.date(localDateTime); DateTime date = DateUtil.date(localDateTime);
@ -828,11 +831,11 @@ public class DateUtilTest {
LocalDate localDate = localDateTime.toLocalDate(); LocalDate localDate = localDateTime.toLocalDate();
DateTime date2 = DateUtil.date(localDate); DateTime date2 = DateUtil.date(localDate);
Assert.assertEquals("2017-05-06", Assert.assertEquals("2017-05-06",
DateUtil.format(date2, DatePattern.NORM_DATE_PATTERN)); DateUtil.format(date2, DatePattern.NORM_DATE_PATTERN));
} }
@Test @Test
public void dateTest2(){ public void dateTest2() {
// 测试负数日期 // 测试负数日期
long dateLong = -1497600000; long dateLong = -1497600000;
final DateTime date = DateUtil.date(dateLong); final DateTime date = DateUtil.date(dateLong);
@ -840,7 +843,7 @@ public class DateUtilTest {
} }
@Test @Test
public void ageTest(){ public void ageTest() {
String d1 = "2000-02-29"; String d1 = "2000-02-29";
String d2 = "2018-02-28"; String d2 = "2018-02-28";
final int age = DateUtil.age(DateUtil.parseDate(d1), DateUtil.parseDate(d2)); final int age = DateUtil.age(DateUtil.parseDate(d1), DateUtil.parseDate(d2));
@ -848,14 +851,14 @@ public class DateUtilTest {
} }
@Test(expected = IllegalArgumentException.class) @Test(expected = IllegalArgumentException.class)
public void ageTest2(){ public void ageTest2() {
String d1 = "2019-02-29"; String d1 = "2019-02-29";
String d2 = "2018-02-28"; String d2 = "2018-02-28";
DateUtil.age(DateUtil.parseDate(d1), DateUtil.parseDate(d2)); DateUtil.age(DateUtil.parseDate(d1), DateUtil.parseDate(d2));
} }
@Test @Test
public void isExpiredTest(){ public void isExpiredTest() {
DateTime startDate = DateUtil.parse("2019-12-01 17:02:30"); DateTime startDate = DateUtil.parse("2019-12-01 17:02:30");
DateTime endDate = DateUtil.parse("2019-12-02 17:02:30"); DateTime endDate = DateUtil.parse("2019-12-02 17:02:30");
int length = 3; int length = 3;
@ -916,7 +919,7 @@ public class DateUtilTest {
@SuppressWarnings("ConstantConditions") @SuppressWarnings("ConstantConditions")
@Test @Test
public void parseSingleNumberTest(){ public void parseSingleNumberTest() {
DateTime dateTime = DateUtil.parse("2020-5-08"); DateTime dateTime = DateUtil.parse("2020-5-08");
Assert.assertEquals("2020-05-08 00:00:00", dateTime.toString()); Assert.assertEquals("2020-05-08 00:00:00", dateTime.toString());
dateTime = DateUtil.parse("2020-5-8"); dateTime = DateUtil.parse("2020-5-8");
@ -938,21 +941,21 @@ public class DateUtilTest {
@SuppressWarnings("ConstantConditions") @SuppressWarnings("ConstantConditions")
@Test @Test
public void parseISO8601Test(){ public void parseISO8601Test() {
String dt = "2020-06-03 12:32:12,333"; String dt = "2020-06-03 12:32:12,333";
final DateTime parse = DateUtil.parse(dt); final DateTime parse = DateUtil.parse(dt);
Assert.assertEquals("2020-06-03 12:32:12", parse.toString()); Assert.assertEquals("2020-06-03 12:32:12", parse.toString());
} }
@Test(expected = DateException.class) @Test(expected = DateException.class)
public void parseNotFitTest(){ public void parseNotFitTest() {
//https://github.com/looly/hutool/issues/1332 //https://github.com/looly/hutool/issues/1332
// 在日期格式不匹配的时候测试是否正常报错 // 在日期格式不匹配的时候测试是否正常报错
DateUtil.parse("2020-12-23", DatePattern.PURE_DATE_PATTERN); DateUtil.parse("2020-12-23", DatePattern.PURE_DATE_PATTERN);
} }
@Test @Test
public void formatTest(){ public void formatTest() {
Calendar calendar = new GregorianCalendar(); Calendar calendar = new GregorianCalendar();
calendar.set(2021, Calendar.JULY, 14, 23, 59, 59); calendar.set(2021, Calendar.JULY, 14, 23, 59, 59);
Date date = new DateTime(calendar); Date date = new DateTime(calendar);
@ -963,7 +966,7 @@ public class DateUtilTest {
} }
@Test @Test
public void formatNormDateTimeFormatterTest(){ public void formatNormDateTimeFormatterTest() {
String format = DateUtil.format(DateUtil.parse("2021-07-14 10:05:38"), DatePattern.NORM_DATETIME_FORMATTER); String format = DateUtil.format(DateUtil.parse("2021-07-14 10:05:38"), DatePattern.NORM_DATETIME_FORMATTER);
Assert.assertEquals("2021-07-14 10:05:38", format); Assert.assertEquals("2021-07-14 10:05:38", format);
@ -973,7 +976,7 @@ public class DateUtilTest {
} }
@Test @Test
public void isWeekendTest(){ public void isWeekendTest() {
DateTime parse = DateUtil.parse("2021-07-28"); DateTime parse = DateUtil.parse("2021-07-28");
Assert.assertFalse(DateUtil.isWeekend(parse)); Assert.assertFalse(DateUtil.isWeekend(parse));
@ -984,14 +987,14 @@ public class DateUtilTest {
} }
@Test @Test
public void parseSingleMonthAndDayTest(){ public void parseSingleMonthAndDayTest() {
final DateTime parse = DateUtil.parse("2021-1-1"); final DateTime parse = DateUtil.parse("2021-1-1");
Assert.assertNotNull(parse); Assert.assertNotNull(parse);
Assert.assertEquals("2021-01-01 00:00:00", parse.toString()); Assert.assertEquals("2021-01-01 00:00:00", parse.toString());
} }
@Test @Test
public void parseByDateTimeFormatterTest(){ public void parseByDateTimeFormatterTest() {
final DateTime parse = DateUtil.parse("2021-12-01", DatePattern.NORM_DATE_FORMATTER); final DateTime parse = DateUtil.parse("2021-12-01", DatePattern.NORM_DATE_FORMATTER);
Assert.assertEquals("2021-12-01 00:00:00", parse.toString()); Assert.assertEquals("2021-12-01 00:00:00", parse.toString());
} }