From e0e07c726fcd62ab6435b67bc033cebfe6a3aec6 Mon Sep 17 00:00:00 2001 From: Looly Date: Tue, 23 Jun 2020 17:47:07 +0800 Subject: [PATCH] add method --- .../cn/hutool/core/date/CalendarUtil.java | 52 ++++++++++++++++ .../java/cn/hutool/core/date/DateUtil.java | 59 ++----------------- .../cn/hutool/core/date/CalendarUtilTest.java | 18 ++++++ .../cn/hutool/core/date/DateUtilTest.java | 4 +- 4 files changed, 78 insertions(+), 55 deletions(-) create mode 100644 hutool-core/src/test/java/cn/hutool/core/date/CalendarUtilTest.java diff --git a/hutool-core/src/main/java/cn/hutool/core/date/CalendarUtil.java b/hutool-core/src/main/java/cn/hutool/core/date/CalendarUtil.java index 8621975d2..ee8ec9e51 100644 --- a/hutool-core/src/main/java/cn/hutool/core/date/CalendarUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/date/CalendarUtil.java @@ -1,6 +1,7 @@ package cn.hutool.core.date; import cn.hutool.core.comparator.CompareUtil; +import cn.hutool.core.convert.NumberChineseFormatter; import cn.hutool.core.util.StrUtil; import java.time.Instant; @@ -389,6 +390,57 @@ public class CalendarUtil { return age(birthday.getTimeInMillis(), dateToCompare.getTimeInMillis()); } + /** + * 将指定Calendar时间格式化为纯中文形式,比如: + * + *
+	 *     2018-02-24 12:13:14转换为 二〇一八年二月二十四日(withTime为false)
+	 *     2018-02-24 12:13:14 转换为 二〇一八年二月二十四日一十二时一十三分一十四秒(withTime为true)
+	 * 
+ * @param calendar {@link Calendar} + * @param withTime 是否包含时间部分 + * @return 格式化后的字符串 + * @since 5.3.9 + */ + public static String formatChineseDate(Calendar calendar, boolean withTime){ + final StringBuilder result = StrUtil.builder(); + + // 年 + String year = String.valueOf(calendar.get(Calendar.YEAR)); + final int length = year.length(); + for(int i = 0;i < length; i++){ + result.append(NumberChineseFormatter.numberCharToChinese(year.charAt(i), false)); + } + result.append('年'); + + // 月 + int month = calendar.get(Calendar.MONTH) + 1; + result.append(NumberChineseFormatter.format(month, false)); + result.append('月'); + + // 日 + int day = calendar.get(Calendar.DAY_OF_MONTH); + result.append(NumberChineseFormatter.format(day, false)); + result.append('日'); + + if(withTime){ + // 时 + int hour = calendar.get(Calendar.HOUR_OF_DAY); + result.append(NumberChineseFormatter.format(hour, false)); + result.append('时'); + // 分 + int minute = calendar.get(Calendar.MINUTE); + result.append(NumberChineseFormatter.format(minute, false)); + result.append('分'); + // 秒 + int second = calendar.get(Calendar.SECOND); + result.append(NumberChineseFormatter.format(second, false)); + result.append('秒'); + } + + return result.toString().replace('零', '〇'); + } + /** * 计算相对于dateToCompare的年龄,长用于计算指定生日在某年的年龄 * diff --git a/hutool-core/src/main/java/cn/hutool/core/date/DateUtil.java b/hutool-core/src/main/java/cn/hutool/core/date/DateUtil.java index bf96e71ef..bfa3e90c3 100644 --- a/hutool-core/src/main/java/cn/hutool/core/date/DateUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/date/DateUtil.java @@ -2,7 +2,6 @@ package cn.hutool.core.date; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.comparator.CompareUtil; -import cn.hutool.core.convert.Convert; import cn.hutool.core.date.format.DateParser; import cn.hutool.core.date.format.DatePrinter; import cn.hutool.core.date.format.FastDateFormat; @@ -613,65 +612,19 @@ public class DateUtil extends CalendarUtil { * @param date 被格式化的日期 * @param isUppercase 是否采用大写形式 * @return 中文日期字符串 - * @since 4.1.19 + * @since 5.3.9 */ - public static String formatChineseDate(Date date, boolean isUppercase) { + public static String formatChineseDate(Date date, boolean isUppercase, boolean withTime) { if (null == date) { return null; } - String format = DatePattern.CHINESE_DATE_FORMAT.format(date); - if (isUppercase) { - final StringBuilder builder = StrUtil.builder(format.length()); - builder.append(Convert.numberToChinese(Integer.parseInt(format.substring(0, 1)), false)); - builder.append(Convert.numberToChinese(Integer.parseInt(format.substring(1, 2)), false)); - builder.append(Convert.numberToChinese(Integer.parseInt(format.substring(2, 3)), false)); - builder.append(Convert.numberToChinese(Integer.parseInt(format.substring(3, 4)), false)); - builder.append(format, 4, 5); - builder.append(Convert.numberToChinese(Integer.parseInt(format.substring(5, 7)), false)); - builder.append(format, 7, 8); - builder.append(Convert.numberToChinese(Integer.parseInt(format.substring(8, 10)), false)); - builder.append(format.substring(10)); - format = builder.toString().replace('零', '〇'); + if (false == isUppercase) { + return (withTime ? DatePattern.CHINESE_DATE_TIME_FORMAT : DatePattern.CHINESE_DATE_FORMAT).format(date); } - return format; + + return CalendarUtil.formatChineseDate(CalendarUtil.calendar(date), withTime); } - - /** - * 格式化为中文日期格式,如果isUppercase为false,则返回类似:2018年10月24日12时13分14秒,否则返回二〇一八年二月二十四日一十二时一十三分一十四秒 - * - * @param date 被格式化的日期 - * @param isUppercase 是否采用大写形式 - * @return 中文日期时间串字符串 - * @since 5.3.7 - */ - public static String formatChineseDateTime(Date date, boolean isUppercase) { - if (null == date) { - return null; - } - - String format = DatePattern.CHINESE_DATE_TIME_FORMAT.format(date); - if (isUppercase) { - final StringBuilder builder = StrUtil.builder(format.length()); - builder.append(Convert.numberToChinese(Integer.parseInt(format.substring(0, 1)), false)); - builder.append(Convert.numberToChinese(Integer.parseInt(format.substring(1, 2)), false)); - builder.append(Convert.numberToChinese(Integer.parseInt(format.substring(2, 3)), false)); - builder.append(Convert.numberToChinese(Integer.parseInt(format.substring(3, 4)), false)); - builder.append(format, 4, 5); - builder.append(Convert.numberToChinese(Integer.parseInt(format.substring(5, 7)), false)); - builder.append(format, 7, 8); - builder.append(Convert.numberToChinese(Integer.parseInt(format.substring(8, 10)), false)); - builder.append(format, 10, 11); - builder.append(Convert.numberToChinese(Integer.parseInt(format.substring(11, 13)), false)); - builder.append(format, 13, 14); - builder.append(Convert.numberToChinese(Integer.parseInt(format.substring(14, 16)), false)); - builder.append(format, 16, 17); - builder.append(Convert.numberToChinese(Integer.parseInt(format.substring(17, 19)), false)); - builder.append(format.substring(19)); - format = builder.toString().replace('零', '〇'); - } - return format; - } // ------------------------------------ Format end ---------------------------------------------- // ------------------------------------ Parse start ---------------------------------------------- diff --git a/hutool-core/src/test/java/cn/hutool/core/date/CalendarUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/date/CalendarUtilTest.java new file mode 100644 index 000000000..ff0eb8ead --- /dev/null +++ b/hutool-core/src/test/java/cn/hutool/core/date/CalendarUtilTest.java @@ -0,0 +1,18 @@ +package cn.hutool.core.date; + +import org.junit.Assert; +import org.junit.Test; + +import java.util.Calendar; + +public class CalendarUtilTest { + + @Test + public void formatChineseDate(){ + Calendar calendar = DateUtil.parse("2018-02-24 12:13:14").toCalendar(); + final String chineseDate = CalendarUtil.formatChineseDate(calendar, false); + Assert.assertEquals("二〇一八年二月二十四日", chineseDate); + final String chineseDateTime = CalendarUtil.formatChineseDate(calendar, true); + Assert.assertEquals("二〇一八年二月二十四日一十二时一十三分一十四秒", chineseDateTime); + } +} diff --git a/hutool-core/src/test/java/cn/hutool/core/date/DateUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/date/DateUtilTest.java index 5ffcfb86c..a7f888c6c 100644 --- a/hutool-core/src/test/java/cn/hutool/core/date/DateUtilTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/date/DateUtilTest.java @@ -220,13 +220,13 @@ public class DateUtilTest { @Test public void formatChineseDateTest() { - String formatChineseDate = DateUtil.formatChineseDate(DateUtil.parse("2018-02-24"), true); + String formatChineseDate = DateUtil.formatChineseDate(DateUtil.parse("2018-02-24"), true, false); Assert.assertEquals("二〇一八年二月二十四日", formatChineseDate); } @Test public void formatChineseDateTimeTest() { - String formatChineseDateTime = DateUtil.formatChineseDateTime(DateUtil.parse("2018-02-24 12:13:14"), true); + String formatChineseDateTime = DateUtil.formatChineseDate(DateUtil.parse("2018-02-24 12:13:14"), true, true); Assert.assertEquals("二〇一八年二月二十四日一十二时一十三分一十四秒", formatChineseDateTime); }