From 7d273f6c527f6270973f23b86df70c74f74845be Mon Sep 17 00:00:00 2001 From: duandazhi Date: Wed, 14 Jul 2021 11:27:42 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E5=B8=B8=E7=94=A8=E6=96=B9=E6=B3=95=20?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=20@see=20=E5=92=8C=20=E5=88=AB=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/cn/hutool/core/date/DateUtil.java | 13 ++++++++---- .../hutool/core/date/LocalDateTimeUtil.java | 4 ++-- .../java/cn/hutool/core/net/Ipv4Util.java | 4 ++-- .../java/cn/hutool/core/text/CharPool.java | 2 +- .../cn/hutool/core/text/CharSequenceUtil.java | 4 ++-- .../java/cn/hutool/core/text/StrPool.java | 1 + .../convert/NumberChineseFormatterTest.java | 2 ++ .../cn/hutool/core/date/DateUtilTest.java | 20 +++++++++++-------- 8 files changed, 31 insertions(+), 19 deletions(-) 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 a81d2af2a..2347b18ba 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 @@ -18,6 +18,7 @@ import java.text.SimpleDateFormat; import java.time.Instant; import java.time.LocalDateTime; import java.time.Year; +import java.time.ZoneId; import java.time.format.DateTimeFormatter; import java.time.temporal.TemporalAccessor; import java.util.Calendar; @@ -481,7 +482,7 @@ public class DateUtil extends CalendarUtil { * 根据特定格式格式化日期 * * @param date 被格式化的日期 - * @param format 日期格式,常用格式见: {@link DatePattern} + * @param format 日期格式,常用格式见: {@link DatePattern} {@link DatePattern#NORM_DATETIME_PATTERN} * @return 格式化后的字符串 */ public static String format(Date date, String format) { @@ -505,7 +506,7 @@ public class DateUtil extends CalendarUtil { * 根据特定格式格式化日期 * * @param date 被格式化的日期 - * @param format {@link DatePrinter} 或 {@link FastDateFormat} + * @param format {@link DatePrinter} 或 {@link FastDateFormat} {@link DatePattern#NORM_DATETIME_FORMAT} * @return 格式化后的字符串 */ public static String format(Date date, DatePrinter format) { @@ -533,7 +534,7 @@ public class DateUtil extends CalendarUtil { * 根据特定格式格式化日期 * * @param date 被格式化的日期 - * @param format {@link SimpleDateFormat} + * @param format {@link SimpleDateFormat} {@link DatePattern#NORM_DATETIME_FORMATTER} * @return 格式化后的字符串 * @since 5.0.0 */ @@ -541,6 +542,10 @@ public class DateUtil extends CalendarUtil { if (null == format || null == date) { return null; } + // java.time.temporal.UnsupportedTemporalTypeException: Unsupported field: YearOfEra + if (format.getZone() == null) { + format = format.withZone(ZoneId.systemDefault()); + } return format.format(date.toInstant()); } @@ -880,7 +885,7 @@ public class DateUtil extends CalendarUtil { *
  • yyyy-MM-dd'T'HH:mm:ss.SSSZ
  • * * - * @param dateCharSequence 日期字符串 + * @param dateCharSequence 日期字符串; 常量如 {@link DatePattern#NORM_DATE_PATTERN}, {@link DatePattern#NORM_DATETIME_PATTERN} * @return 日期 */ public static DateTime parse(CharSequence dateCharSequence) { diff --git a/hutool-core/src/main/java/cn/hutool/core/date/LocalDateTimeUtil.java b/hutool-core/src/main/java/cn/hutool/core/date/LocalDateTimeUtil.java index a40065243..66ffb40f5 100644 --- a/hutool-core/src/main/java/cn/hutool/core/date/LocalDateTimeUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/date/LocalDateTimeUtil.java @@ -373,7 +373,7 @@ public class LocalDateTimeUtil { * 格式化日期时间为指定格式 * * @param date {@link LocalDate} - * @param formatter 日期格式化器,预定义的格式见:{@link DateTimeFormatter} + * @param formatter 日期格式化器,预定义的格式见:{@link DateTimeFormatter}; 常量如: {@link DatePattern#NORM_DATE_FORMATTER}, {@link DatePattern#NORM_DATETIME_FORMATTER} * @return 格式化后的字符串 * @since 5.3.10 */ @@ -385,7 +385,7 @@ public class LocalDateTimeUtil { * 格式化日期时间为指定格式 * * @param date {@link LocalDate} - * @param format 日期格式,类似于yyyy-MM-dd + * @param format 日期格式,类似于yyyy-MM-dd, 常量如 {@link DatePattern#NORM_DATE_PATTERN}, {@link DatePattern#NORM_DATETIME_PATTERN} * @return 格式化后的字符串 * @since 5.3.10 */ diff --git a/hutool-core/src/main/java/cn/hutool/core/net/Ipv4Util.java b/hutool-core/src/main/java/cn/hutool/core/net/Ipv4Util.java index 881670159..3b6ab8140 100644 --- a/hutool-core/src/main/java/cn/hutool/core/net/Ipv4Util.java +++ b/hutool-core/src/main/java/cn/hutool/core/net/Ipv4Util.java @@ -148,7 +148,7 @@ public class Ipv4Util { /** * 根据ip地址(xxx.xxx.xxx.xxx)计算出long型的数据 - * + * 方法别名:inet_aton * @param strIP IP V4 地址 * @return long值 */ @@ -160,7 +160,7 @@ public class Ipv4Util { /** * 根据 ip/掩码位 计算IP段的起始IP(字符串型) - * + * 方法别名:inet_ntoa * @param ip 给定的IP,如218.240.38.69 * @param maskBit 给定的掩码位,如30 * @return 起始IP的字符串表示 diff --git a/hutool-core/src/main/java/cn/hutool/core/text/CharPool.java b/hutool-core/src/main/java/cn/hutool/core/text/CharPool.java index 06b922a73..228f02209 100644 --- a/hutool-core/src/main/java/cn/hutool/core/text/CharPool.java +++ b/hutool-core/src/main/java/cn/hutool/core/text/CharPool.java @@ -2,7 +2,7 @@ package cn.hutool.core.text; /** * 常用字符常量 - * + * @see StrPool * @author looly * @since 5.6.3 */ diff --git a/hutool-core/src/main/java/cn/hutool/core/text/CharSequenceUtil.java b/hutool-core/src/main/java/cn/hutool/core/text/CharSequenceUtil.java index a86d1ef6e..9327a6a44 100644 --- a/hutool-core/src/main/java/cn/hutool/core/text/CharSequenceUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/text/CharSequenceUtil.java @@ -4260,7 +4260,7 @@ public class CharSequenceUtil { /** * 以 conjunction 为分隔符将多个对象转换为字符串 * - * @param conjunction 分隔符 + * @param conjunction 分隔符 {@link StrPool#COMMA} * @param objs 数组 * @return 连接后的字符串 * @see ArrayUtil#join(Object, CharSequence) @@ -4273,7 +4273,7 @@ public class CharSequenceUtil { * 以 conjunction 为分隔符将多个对象转换为字符串 * * @param 元素类型 - * @param conjunction 分隔符 + * @param conjunction 分隔符 {@link StrPool#COMMA} * @param iterable 集合 * @return 连接后的字符串 * @see CollUtil#join(Iterable, CharSequence) diff --git a/hutool-core/src/main/java/cn/hutool/core/text/StrPool.java b/hutool-core/src/main/java/cn/hutool/core/text/StrPool.java index 2a90f7879..743c4e474 100644 --- a/hutool-core/src/main/java/cn/hutool/core/text/StrPool.java +++ b/hutool-core/src/main/java/cn/hutool/core/text/StrPool.java @@ -4,6 +4,7 @@ import cn.hutool.core.util.XmlUtil; /** * 常用字符串常量定义 + * @see CharPool * * @author looly * @since 5.6.3 diff --git a/hutool-core/src/test/java/cn/hutool/core/convert/NumberChineseFormatterTest.java b/hutool-core/src/test/java/cn/hutool/core/convert/NumberChineseFormatterTest.java index 3fce2769c..72fe79008 100644 --- a/hutool-core/src/test/java/cn/hutool/core/convert/NumberChineseFormatterTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/convert/NumberChineseFormatterTest.java @@ -7,6 +7,8 @@ public class NumberChineseFormatterTest { @Test public void formatTest() { + String f0 = NumberChineseFormatter.format(50008000, false); + Assert.assertEquals("五千万零8千", f0); String f1 = NumberChineseFormatter.format(10889.72356, false); Assert.assertEquals("一万零八百八十九点七二", f1); f1 = NumberChineseFormatter.format(12653, false); 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 d80795466..3d8b0172a 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 @@ -13,14 +13,7 @@ import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; import java.time.format.DateTimeFormatter; -import java.util.ArrayList; -import java.util.Calendar; -import java.util.Date; -import java.util.LinkedHashSet; -import java.util.List; -import java.util.Locale; -import java.util.Objects; -import java.util.TimeZone; +import java.util.*; /** * 时间工具单元测试
    @@ -893,4 +886,15 @@ public class DateUtilTest { // 在日期格式不匹配的时候,测试是否正常报错 DateUtil.parse("2020-12-23", DatePattern.PURE_DATE_PATTERN); } + + @Test + public void formatTest(){ + Calendar calendar = new GregorianCalendar(); + calendar.set(2021, Calendar.JULY, 14, 23, 59, 59); + Date date = new DateTime(calendar); + + Assert.assertEquals("2021-07-14 23:59:59", DateUtil.format(date, DatePattern.NORM_DATETIME_FORMATTER)); + Assert.assertEquals("2021-07-14 23:59:59", DateUtil.format(date, DatePattern.NORM_DATETIME_FORMAT)); + Assert.assertEquals("2021-07-14 23:59:59", DateUtil.format(date, DatePattern.NORM_DATETIME_PATTERN)); + } } From 65103f3916f44e447757e8a881c1bbb67d58c281 Mon Sep 17 00:00:00 2001 From: duandazhi Date: Wed, 14 Jul 2021 17:40:09 +0800 Subject: [PATCH 2/3] =?UTF-8?q?=E4=BF=AE=E6=94=B9=20pr=20by=20close?= =?UTF-8?q?=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/cn/hutool/core/date/DateUtil.java | 5 +---- .../core/convert/NumberChineseFormatterTest.java | 2 +- .../test/java/cn/hutool/core/date/DateUtilTest.java | 10 +++++++++- .../src/main/java/cn/hutool/extra/ftp/Ftp.java | 4 ++++ .../main/java/cn/hutool/extra/qrcode/QrCodeUtil.java | 3 ++- .../java/cn/hutool/extra/qrcode/QrCodeUtilTest.java | 12 +++++++++--- 6 files changed, 26 insertions(+), 10 deletions(-) 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 b3994f820..c84e16efd 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 @@ -542,10 +542,7 @@ public class DateUtil extends CalendarUtil { if (null == format || null == date) { return null; } - // java.time.temporal.UnsupportedTemporalTypeException: Unsupported field: YearOfEra - if (format.getZone() == null) { - format = format.withZone(ZoneId.systemDefault()); - } + /// java.time.temporal.UnsupportedTemporalTypeException: Unsupported field: YearOfEra /// return format.format(date.toInstant()); return TemporalAccessorUtil.format(date.toInstant(), format); } diff --git a/hutool-core/src/test/java/cn/hutool/core/convert/NumberChineseFormatterTest.java b/hutool-core/src/test/java/cn/hutool/core/convert/NumberChineseFormatterTest.java index 72fe79008..21b5248ce 100644 --- a/hutool-core/src/test/java/cn/hutool/core/convert/NumberChineseFormatterTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/convert/NumberChineseFormatterTest.java @@ -8,7 +8,7 @@ public class NumberChineseFormatterTest { @Test public void formatTest() { String f0 = NumberChineseFormatter.format(50008000, false); - Assert.assertEquals("五千万零8千", f0); + Assert.assertEquals("五千万零八千", f0); String f1 = NumberChineseFormatter.format(10889.72356, false); Assert.assertEquals("一万零八百八十九点七二", f1); f1 = NumberChineseFormatter.format(12653, false); 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 bb4f7fa4e..0ea1d0f9b 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 @@ -13,7 +13,15 @@ import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; import java.time.format.DateTimeFormatter; -import java.util.*; +import java.util.Locale; +import java.util.Objects; +import java.util.TimeZone; +import java.util.List; +import java.util.ArrayList; +import java.util.Date; +import java.util.Calendar; +import java.util.LinkedHashSet; +import java.util.GregorianCalendar; /** * 时间工具单元测试
    diff --git a/hutool-extra/src/main/java/cn/hutool/extra/ftp/Ftp.java b/hutool-extra/src/main/java/cn/hutool/extra/ftp/Ftp.java index 67a0686b3..02c089cea 100644 --- a/hutool-extra/src/main/java/cn/hutool/extra/ftp/Ftp.java +++ b/hutool-extra/src/main/java/cn/hutool/extra/ftp/Ftp.java @@ -26,6 +26,10 @@ import java.util.List; * FTP客户端封装
    * 此客户端基于Apache-Commons-Net * + * 常见搭建ftp的工具有 + * 1、filezila server ;根目录一般都是空 + * 2、linux vsftpd ; 使用的 系统用户的目录,这里往往都是不是根目录,如:/home/ftpuser/ftp + * * @author looly * @since 4.1.8 */ diff --git a/hutool-extra/src/main/java/cn/hutool/extra/qrcode/QrCodeUtil.java b/hutool-extra/src/main/java/cn/hutool/extra/qrcode/QrCodeUtil.java index ac77808ca..ec0ca33d9 100644 --- a/hutool-extra/src/main/java/cn/hutool/extra/qrcode/QrCodeUtil.java +++ b/hutool-extra/src/main/java/cn/hutool/extra/qrcode/QrCodeUtil.java @@ -28,7 +28,8 @@ import java.util.HashMap; /** * 基于Zxing的二维码工具类 - * + * 参见二维码网站: + *

    https://cli.im/text

    * @author looly * @since 4.0.2 */ diff --git a/hutool-extra/src/test/java/cn/hutool/extra/qrcode/QrCodeUtilTest.java b/hutool-extra/src/test/java/cn/hutool/extra/qrcode/QrCodeUtilTest.java index c1af336f5..78650e129 100644 --- a/hutool-extra/src/test/java/cn/hutool/extra/qrcode/QrCodeUtilTest.java +++ b/hutool-extra/src/test/java/cn/hutool/extra/qrcode/QrCodeUtilTest.java @@ -35,16 +35,22 @@ public class QrCodeUtilTest { // 背景色透明 config.setBackColor(null); config.setErrorCorrection(ErrorCorrectionLevel.H); - QrCodeUtil.generate("https://hutool.cn/", config, FileUtil.file("d:/qrcodeCustom.png")); + String path = FileUtil.isWindows() ? "d:/hutool/qrcodeCustom.png" : "~/Desktop/hutool/qrcodeCustom.png"; + if (!FileUtil.file(path).getParentFile().exists()) { + FileUtil.file(path).getParentFile().mkdirs(); + } + QrCodeUtil.generate("https://hutool.cn/", config, FileUtil.file(path)); } @Test @Ignore public void generateWithLogoTest() { + String icon = FileUtil.isWindows() ? "d:/hutool/pic/face.jpg" : "~/Desktop/hutool/pic/face.jpg"; + String targetPath = FileUtil.isWindows() ? "d:/hutool/qrcodeWithLogo.jpg" : "~/Desktop/hutool/qrcodeWithLogo.jpg"; QrCodeUtil.generate(// "http://hutool.cn/", // - QrConfig.create().setImg("e:/pic/face.jpg"), // - FileUtil.file("e:/qrcodeWithLogo.jpg")); + QrConfig.create().setImg(icon), // + FileUtil.file(targetPath)); } @Test From c842aa1cf98baa85e17403869d9b6127dbaab0cf Mon Sep 17 00:00:00 2001 From: duandazhi Date: Thu, 15 Jul 2021 09:58:42 +0800 Subject: [PATCH 3/3] =?UTF-8?q?[=E8=BD=BB=E9=87=8F=E7=BA=A7pr]=20=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E5=B8=B8=E7=94=A8@=20see=20,=20fix=20pulls/368?= =?UTF-8?q?=E3=80=81pulls/369=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/cn/hutool/core/date/DateUtil.java | 2 +- .../cn/hutool/core/text/CharSequenceUtil.java | 60 ++++++++++--------- 2 files changed, 34 insertions(+), 28 deletions(-) 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 c84e16efd..61385e3d5 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 @@ -883,7 +883,7 @@ public class DateUtil extends CalendarUtil { *
  • yyyy-MM-dd'T'HH:mm:ss.SSSZ
  • * * - * @param dateCharSequence 日期字符串; 常量如 {@link DatePattern#NORM_DATE_PATTERN}, {@link DatePattern#NORM_DATETIME_PATTERN} + * @param dateCharSequence 日期字符串 * @return 日期 */ public static DateTime parse(CharSequence dateCharSequence) { diff --git a/hutool-core/src/main/java/cn/hutool/core/text/CharSequenceUtil.java b/hutool-core/src/main/java/cn/hutool/core/text/CharSequenceUtil.java index 9327a6a44..06b1dbebd 100644 --- a/hutool-core/src/main/java/cn/hutool/core/text/CharSequenceUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/text/CharSequenceUtil.java @@ -624,8 +624,8 @@ public class CharSequenceUtil { /** * 按照断言,除去字符串头尾部的断言为真的字符,如果字符串是{@code null},依然返回{@code null}。 * - * @param str 要处理的字符串 - * @param mode {@code -1}表示trimStart,{@code 0}表示trim全部, {@code 1}表示trimEnd + * @param str 要处理的字符串 + * @param mode {@code -1}表示trimStart,{@code 0}表示trim全部, {@code 1}表示trimEnd * @param predicate 断言是否过掉字符,返回{@code true}表述过滤掉,{@code false}表示不过滤 * @return 除去指定字符后的的字符串,如果原字串为{@code null},则返回{@code null} * @since 5.7.4 @@ -4033,39 +4033,45 @@ public class CharSequenceUtil { char c; for (int i = 0; i < length; i++) { c = str.charAt(i); - final Character preChar = (i > 0) ? str.charAt(i - 1) : null; if (Character.isUpperCase(c)) { - // 遇到大写字母处理 + final Character preChar = (i > 0) ? str.charAt(i - 1) : null; final Character nextChar = (i < str.length() - 1) ? str.charAt(i + 1) : null; - if (null != preChar && Character.isUpperCase(preChar)) { - // 前一个字符为大写,则按照一个词对待,例如AB - sb.append(c); - } else if (null != nextChar && (false == Character.isLowerCase(nextChar))) { - // 后一个为非小写字母,按照一个词对待 - if (null != preChar && symbol != preChar) { - // 前一个是非大写时按照新词对待,加连接符,例如xAB + + if (null != preChar) { + if (symbol == preChar) { + // 前一个为分隔符 + if (null == nextChar || Character.isLowerCase(nextChar)) { + //普通首字母大写,如_Abb -> _abb + c = Character.toLowerCase(c); + } + //后一个为大写,按照专有名词对待,如_AB -> _AB + } else if (Character.isLowerCase(preChar)) { + // 前一个为小写 sb.append(symbol); + if (null == nextChar || Character.isLowerCase(nextChar)) { + //普通首字母大写,如aBcc -> a_bcc + c = Character.toLowerCase(c); + } + // 后一个为大写,按照专有名词对待,如aBC -> a_BC + } else { + //前一个为大写 + if (null == nextChar || Character.isLowerCase(nextChar)) { + // 普通首字母大写,如ABcc -> A_bcc + sb.append(symbol); + c = Character.toLowerCase(c); + } + // 后一个为大写,按照专有名词对待,如ABC -> ABC } - sb.append(c); } else { - // 前后都为非大写按照新词对待 - if (null != preChar && symbol != preChar) { - // 前一个非连接符,补充连接符 - sb.append(symbol); + // 首字母,需要根据后一个判断是否转为小写 + if (null == nextChar || Character.isLowerCase(nextChar)) { + // 普通首字母大写,如Abc -> abc + c = Character.toLowerCase(c); } - sb.append(Character.toLowerCase(c)); + // 后一个为大写,按照专有名词对待,如ABC -> ABC } - } else { - if (symbol != c - && sb.length() > 0 - && Character.isUpperCase(sb.charAt(-1)) - && Character.isLowerCase(c)) { - // 当结果中前一个字母为大写,当前为小写(非数字或字符),说明此字符为新词开始(连接符也表示新词) - sb.append(symbol); - } - // 小写或符号 - sb.append(c); } + sb.append(c); } return sb.toString(); }