diff --git a/src/main/java/xyz/zhouxy/plusone/commons/sql/JdbcSql.java b/src/main/java/xyz/zhouxy/plusone/commons/sql/JdbcSql.java index d24ed8a..5844d28 100644 --- a/src/main/java/xyz/zhouxy/plusone/commons/sql/JdbcSql.java +++ b/src/main/java/xyz/zhouxy/plusone/commons/sql/JdbcSql.java @@ -18,6 +18,8 @@ package xyz.zhouxy.plusone.commons.sql; import java.util.Collection; +import xyz.zhouxy.plusone.commons.util.StringTools; + public class JdbcSql extends SQL { JdbcSql() { @@ -33,40 +35,38 @@ public class JdbcSql extends SQL { return this; } - public static String IN(String col, Collection c) { + public static String IN(String col, Collection c) { // NOSONAR return IN(col, c.size()); } - public static String IN(String col, T[] c) { + public static String IN(String col, T[] c) { // NOSONAR return IN(col, c.length); } - private static String IN(String col, int length) { - return col + " IN (" + String.valueOf(buildQuestionsList(length)) + ')'; + private static String IN(String col, int length) { // NOSONAR + if (length == 0) { + return "false"; + } + return col + " IN (" + buildQuestionsList(length) + ')'; } - public static String NOT_IN(String col, Collection c) { + public static String NOT_IN(String col, Collection c) { // NOSONAR return NOT_IN(col, c.size()); } - public static String NOT_IN(String col, T[] c) { + public static String NOT_IN(String col, T[] c) { // NOSONAR return NOT_IN(col, c.length); } - private static String NOT_IN(String col, int length) { - return col + " NOT IN (" + String.valueOf(buildQuestionsList(length)) + ')'; + private static String NOT_IN(String col, int length) { // NOSONAR + if (length == 0) { + return "true"; + } + return col + " NOT IN (" + buildQuestionsList(length) + ')'; } - private static char[] buildQuestionsList(int times) { - char[] arr = new char[times * 3 - 2]; - int i = 0; - for (int t = 1; t <= times; t++) { - arr[i++] = '?'; - if (t < times) { - arr[i++] = ','; - arr[i++] = ' '; - } - } - return arr; + private static String buildQuestionsList(int times) { + final int length = times <= 0 ? 0 : (times * 3 - 2); + return StringTools.repeat("?, ", times, length); } } diff --git a/src/main/java/xyz/zhouxy/plusone/commons/sql/MyBatisSql.java b/src/main/java/xyz/zhouxy/plusone/commons/sql/MyBatisSql.java index 3592205..0382d43 100644 --- a/src/main/java/xyz/zhouxy/plusone/commons/sql/MyBatisSql.java +++ b/src/main/java/xyz/zhouxy/plusone/commons/sql/MyBatisSql.java @@ -41,11 +41,11 @@ public class MyBatisSql extends SQL { return this; } - public static String IN(String col, String paramName) { + public static String IN(String col, String paramName) { // NOSONAR return " " + col + " IN" + buildForeach(col, paramName); } - public static String NOT_IN(String col, String paramName) { + public static String NOT_IN(String col, String paramName) { // NOSONAR return col + " NOT IN" + buildForeach(col, paramName); } diff --git a/src/main/java/xyz/zhouxy/plusone/commons/sql/SQL.java b/src/main/java/xyz/zhouxy/plusone/commons/sql/SQL.java index b0ef318..a699639 100644 --- a/src/main/java/xyz/zhouxy/plusone/commons/sql/SQL.java +++ b/src/main/java/xyz/zhouxy/plusone/commons/sql/SQL.java @@ -34,14 +34,14 @@ public abstract class SQL extends AbstractSQL { return new MyBatisSql(withScript); } - public T WHERE(boolean condition, String sqlCondition) { + public T WHERE(boolean condition, String sqlCondition) { // NOSONAR if (condition) { return WHERE(sqlCondition); } return getSelf(); } - public T WHERE(boolean condition, String ifSqlCondition, String elseSqlCondition) { + public T WHERE(boolean condition, String ifSqlCondition, String elseSqlCondition) { // NOSONAR return WHERE(condition ? ifSqlCondition : elseSqlCondition); } } diff --git a/src/main/java/xyz/zhouxy/plusone/commons/util/DateTimeTools.java b/src/main/java/xyz/zhouxy/plusone/commons/util/DateTimeTools.java index d77c09d..28e1989 100644 --- a/src/main/java/xyz/zhouxy/plusone/commons/util/DateTimeTools.java +++ b/src/main/java/xyz/zhouxy/plusone/commons/util/DateTimeTools.java @@ -21,19 +21,17 @@ import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; import java.time.Month; +import java.time.Year; import java.time.YearMonth; import java.time.ZoneId; import java.time.ZonedDateTime; -import java.time.format.DateTimeFormatter; +import java.time.chrono.IsoChronology; import java.util.Calendar; import java.util.Date; import java.util.TimeZone; -import javax.annotation.Nonnull; - -import com.google.common.cache.CacheBuilder; -import com.google.common.cache.CacheLoader; -import com.google.common.cache.LoadingCache; +import com.google.common.base.Strings; +import com.google.common.collect.Range; import xyz.zhouxy.plusone.commons.time.Quarter; import xyz.zhouxy.plusone.commons.time.YearQuarter; @@ -45,89 +43,32 @@ import xyz.zhouxy.plusone.commons.time.YearQuarter; */ public class DateTimeTools { - /** - * 缓存时间格式化器 - */ - private static final LoadingCache DATE_TIME_FORMATTER_CACHE = CacheBuilder.newBuilder() - .maximumSize(20) - .build(new CacheLoader() { - @Override - public DateTimeFormatter load(@Nonnull String pattern) throws Exception { - return DateTimeFormatter.ofPattern(pattern); - } - }); - - /** - * 获取时间格式化器 - * - * @param pattern 时间格式 - * @return 时间格式化器 - */ - public static DateTimeFormatter getDateTimeFormatter(String pattern) { - return DATE_TIME_FORMATTER_CACHE.getUnchecked(pattern); - } - // #region - toString - /** - * 将日期时间转换为指定格式的字符串 - * - * @param pattern 时间格式 - * @param dateTime 日期时间 - * @return 格式化的字符串 - */ - public static String toString(String pattern, ZonedDateTime dateTime) { - return getDateTimeFormatter(pattern).format(dateTime); + public static String toYearString(int year) { + return Integer.toString(year); } - /** - * 将时间戳转换为指定格式的字符串,使用系统默认时区 - * - * @param pattern 时间格式 - * @param instant 时间戳 - * @return 格式化的字符串 - */ - public static String toString(String pattern, Instant instant) { - ZonedDateTime dateTime = instant.atZone(ZoneId.systemDefault()); - return toString(pattern, dateTime); + public static String toYearString(Year year) { + return year.toString(); } - /** - * 将时间戳转换为指定格式的字符串,使用指定时区 - * - * @param pattern 时间格式 - * @param instant 时间戳 - * @param zone 时区 - * @return 格式化的字符串 - */ - public static String toString(String pattern, Instant instant, ZoneId zone) { - ZonedDateTime dateTime = instant.atZone(zone); - return toString(pattern, dateTime); + public static String toMonthString(int monthValue) { + return Strings.padStart(Integer.toString(monthValue), 2, '0'); } - // #endregion - - // #region - nowStr - - /** - * 指定格式,返回当前时间戳对应的字符串 - * - * @param pattern 时间格式 - * @return 格式化的字符串 - */ - public static String nowStr(String pattern) { - return toString(pattern, ZonedDateTime.now()); + public static String toMonthString(int monthValue, boolean padStart) { + return padStart ? toMonthString(monthValue) : Integer.toString(monthValue); } - /** - * 指定格式,返回当前时间戳对应的字符串,使用指定时区 - * - * @param pattern 时间格式 - * @param zone 时区 - * @return 格式化的字符串 - */ - public static String nowStr(String pattern, ZoneId zone) { - return toString(pattern, Instant.now().atZone(zone)); + public static String toMonthString(Month month) { + final int monthValue = month.getValue(); + return Strings.padStart(Integer.toString(monthValue), 2, '0'); + } + + public static String toMonthString(Month month, boolean padStart) { + final int monthValue = month.getValue(); + return padStart ? toMonthString(month) : Integer.toString(monthValue); } // #endregion @@ -708,6 +649,42 @@ public class DateTimeTools { // #endregion + // ================================ + // #region - others + // ================================ + + public static LocalDate startDateOfYear(int year) { + return LocalDate.ofYearDay(year, 1); + } + + public static LocalDate endDateOfYear(int year) { + return LocalDate.of(year, 12, 31); + } + + public static LocalDateTime startOfNextDate(LocalDate date) { + return date.plusDays(1L).atStartOfDay(); + } + + public static ZonedDateTime startOfNextDate(LocalDate date, ZoneId zone) { + return date.plusDays(1L).atStartOfDay(zone); + } + + public static Range toDateTimeRange(LocalDate date) { + return Range.closedOpen(date.atStartOfDay(), startOfNextDate(date)); + } + + public static Range toDateTimeRange(LocalDate date, ZoneId zone) { + return Range.closedOpen(date.atStartOfDay(zone), startOfNextDate(date, zone)); + } + + public static boolean isLeapYear(int year) { + return IsoChronology.INSTANCE.isLeapYear(year); + } + + // ================================ + // #endregion - others + // ================================ + /** * 私有构造方法,明确标识该常量类的作用。 */ diff --git a/src/test/java/xyz/zhouxy/plusone/commons/util/DateTimeToolsTests.java b/src/test/java/xyz/zhouxy/plusone/commons/util/DateTimeToolsTests.java index 28708a7..370c0eb 100644 --- a/src/test/java/xyz/zhouxy/plusone/commons/util/DateTimeToolsTests.java +++ b/src/test/java/xyz/zhouxy/plusone/commons/util/DateTimeToolsTests.java @@ -20,6 +20,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import java.time.Instant; import java.time.LocalDateTime; +import java.time.Month; import java.time.ZoneId; import java.time.ZonedDateTime; import java.time.format.DateTimeFormatter; @@ -32,13 +33,6 @@ class DateTimeToolsTests { private static final Logger log = LoggerFactory.getLogger(DateTimeToolsTests.class); - @Test - void testLocalNowStr() { - String nowStr = DateTimeTools.nowStr("yyyy/MM/dd HH:mm:ss.SSS"); - log.info(nowStr); - assertEquals(23, nowStr.length()); - } - @Test void testToJoda() { LocalDateTime dt = LocalDateTime.of(2008, 8, 8, 20, 18, 59, 108000000); @@ -55,7 +49,8 @@ class DateTimeToolsTests { void testToInstant() { ZonedDateTime dt = ZonedDateTime.of(2008, 1, 8, 10, 23, 50, 108000000, ZoneId.systemDefault()); Instant instant = DateTimeTools.toInstant(dt.toInstant().toEpochMilli()); - String str = DateTimeTools.toString("yy-M-d HH:mm:ss.SSS", instant); + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yy-M-d HH:mm:ss.SSS"); + String str = formatter.format(instant.atZone(ZoneId.systemDefault())); log.info(str); assertEquals("08-1-8 10:23:50.108", str); } @@ -107,4 +102,11 @@ class DateTimeToolsTests { log.info("{}", formatter); log.info("{}", formatter2); } + + @Test + void testToString() { + assertEquals("04", DateTimeTools.toMonthString(Month.APRIL)); + assertEquals("04", DateTimeTools.toMonthString(Month.APRIL, true)); + assertEquals("4", DateTimeTools.toMonthString(Month.APRIL, false)); + } }