Browse Source

add method

Looly 5 years ago
parent
commit
e0e07c726f

+ 52 - 0
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;
@@ -390,6 +391,57 @@ public class CalendarUtil {
 	}
 
 	/**
+	 * 将指定Calendar时间格式化为纯中文形式,比如:
+	 *
+	 * <pre>
+	 *     2018-02-24 12:13:14转换为 二〇一八年二月二十四日(withTime为false)
+	 *     2018-02-24 12:13:14 转换为 二〇一八年二月二十四日一十二时一十三分一十四秒(withTime为true)
+	 * </pre>
+	 * @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的年龄,长用于计算指定生日在某年的年龄
 	 *
 	 * @param birthday      生日

+ 6 - 53
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('零', '〇');
-		}
-		return format;
-	}
-	
-	/**
-	 * 格式化为中文日期格式,如果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;
+		if (false == isUppercase) {
+			return (withTime ? DatePattern.CHINESE_DATE_TIME_FORMAT : DatePattern.CHINESE_DATE_FORMAT).format(date);
 		}
 
-		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;
-	}	
+		return CalendarUtil.formatChineseDate(CalendarUtil.calendar(date), withTime);
+	}
 	// ------------------------------------ Format end ----------------------------------------------
 
 	// ------------------------------------ Parse start ----------------------------------------------

+ 18 - 0
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);
+	}
+}

+ 2 - 2
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);
     }