package cn.hutool.core.date; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.comparator.CompareUtil; import cn.hutool.core.date.format.DateParser; import cn.hutool.core.date.format.DatePrinter; import cn.hutool.core.date.format.FastDateFormat; import cn.hutool.core.lang.Assert; import cn.hutool.core.lang.PatternPool; import cn.hutool.core.util.CharUtil; import cn.hutool.core.util.NumberUtil; import cn.hutool.core.util.ReUtil; import cn.hutool.core.util.StrUtil; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.time.Instant; import java.time.LocalDateTime; import java.time.Year; import java.time.format.DateTimeFormatter; import java.time.temporal.TemporalAccessor; import java.util.Calendar; import java.util.Date; import java.util.GregorianCalendar; import java.util.LinkedHashSet; import java.util.List; import java.util.Locale; import java.util.TimeZone; import java.util.concurrent.TimeUnit; import java.util.regex.Matcher; /** * 时间工具类 * * @author xiaoleilu */ public class DateUtil extends CalendarUtil { /** * java.util.Date EEE MMM zzz 缩写数组 */ private final static String[] wtb = { // "sun", "mon", "tue", "wed", "thu", "fri", "sat", // 星期 "jan", "feb", "mar", "apr", "may", "jun", "jul", "aug", "sep", "oct", "nov", "dec", // "gmt", "ut", "utc", "est", "edt", "cst", "cdt", "mst", "mdt", "pst", "pdt"// }; /** * 当前时间,转换为{@link DateTime}对象 * * @return 当前时间 */ public static DateTime date() { return new DateTime(); } /** * 当前时间,转换为{@link DateTime}对象,忽略毫秒部分 * * @return 当前时间 * @since 4.6.2 */ public static DateTime dateSecond() { return beginOfSecond(date()); } /** * {@link Date}类型时间转为{@link DateTime}<br> * 如果date本身为DateTime对象,则返回强转后的对象,否则新建一个DateTime对象 * * @param date Long类型Date(Unix时间戳) * @return 时间对象 * @since 3.0.7 */ public static DateTime date(Date date) { if (date instanceof DateTime) { return (DateTime) date; } return dateNew(date); } /** * 根据已有{@link Date} 产生新的{@link DateTime}对象 * * @param date Date对象 * @return {@link DateTime}对象 * @since 4.3.1 */ public static DateTime dateNew(Date date) { return new DateTime(date); } /** * Long类型时间转为{@link DateTime}<br> * 只支持毫秒级别时间戳,如果需要秒级别时间戳,请自行×1000 * * @param date Long类型Date(Unix时间戳) * @return 时间对象 */ public static DateTime date(long date) { return new DateTime(date); } /** * {@link Calendar}类型时间转为{@link DateTime}<br> * 始终根据已有{@link Calendar} 产生新的{@link DateTime}对象 * * @param calendar {@link Calendar} * @return 时间对象 */ public static DateTime date(Calendar calendar) { return new DateTime(calendar); } /** * {@link TemporalAccessor}类型时间转为{@link DateTime}<br> * 始终根据已有{@link TemporalAccessor} 产生新的{@link DateTime}对象 * * @param temporalAccessor {@link TemporalAccessor} * @return 时间对象 * @since 5.0.0 */ public static DateTime date(TemporalAccessor temporalAccessor) { return new DateTime(temporalAccessor); } /** * 当前时间的时间戳 * * @return 时间 */ public static long current() { return System.currentTimeMillis(); } /** * 当前时间的时间戳(秒) * * @return 当前时间秒数 * @since 4.0.0 */ public static long currentSeconds() { return System.currentTimeMillis() / 1000; } /** * 当前时间,格式 yyyy-MM-dd HH:mm:ss * * @return 当前时间的标准形式字符串 */ public static String now() { return formatDateTime(new DateTime()); } /** * 当前日期,格式 yyyy-MM-dd * * @return 当前日期的标准形式字符串 */ public static String today() { return formatDate(new DateTime()); } // -------------------------------------------------------------- Part of Date start /** * 获得年的部分 * * @param date 日期 * @return 年的部分 */ public static int year(Date date) { return DateTime.of(date).year(); } /** * 获得指定日期所属季度,从1开始计数 * * @param date 日期 * @return 第几个季度 * @since 4.1.0 */ public static int quarter(Date date) { return DateTime.of(date).quarter(); } /** * 获得指定日期所属季度 * * @param date 日期 * @return 第几个季度枚举 * @since 4.1.0 */ public static Quarter quarterEnum(Date date) { return DateTime.of(date).quarterEnum(); } /** * 获得月份,从0开始计数 * * @param date 日期 * @return 月份,从0开始计数 */ public static int month(Date date) { return DateTime.of(date).month(); } /** * 获得月份 * * @param date 日期 * @return {@link Month} */ public static Month monthEnum(Date date) { return DateTime.of(date).monthEnum(); } /** * 获得指定日期是所在年份的第几周<br> * 此方法返回值与一周的第一天有关,比如:<br> * 2016年1月3日为周日,如果一周的第一天为周日,那这天是第二周(返回2)<br> * 如果一周的第一天为周一,那这天是第一周(返回1)<br> * 跨年的那个星期得到的结果总是1 * * @param date 日期 * @return 周 * @see DateTime#setFirstDayOfWeek(Week) */ public static int weekOfYear(Date date) { return DateTime.of(date).weekOfYear(); } /** * 获得指定日期是所在月份的第几周<br> * * @param date 日期 * @return 周 */ public static int weekOfMonth(Date date) { return DateTime.of(date).weekOfMonth(); } /** * 获得指定日期是这个日期所在月份的第几天<br> * * @param date 日期 * @return 天 */ public static int dayOfMonth(Date date) { return DateTime.of(date).dayOfMonth(); } /** * 获得指定日期是这个日期所在年的第几天 * * @param date 日期 * @return 天 * @since 5.3.6 */ public static int dayOfYear(Date date) { return DateTime.of(date).dayOfYear(); } /** * 获得指定日期是星期几,1表示周日,2表示周一 * * @param date 日期 * @return 天 */ public static int dayOfWeek(Date date) { return DateTime.of(date).dayOfWeek(); } /** * 获得指定日期是星期几 * * @param date 日期 * @return {@link Week} */ public static Week dayOfWeekEnum(Date date) { return DateTime.of(date).dayOfWeekEnum(); } /** * 获得指定日期的小时数部分<br> * * @param date 日期 * @param is24HourClock 是否24小时制 * @return 小时数 */ public static int hour(Date date, boolean is24HourClock) { return DateTime.of(date).hour(is24HourClock); } /** * 获得指定日期的分钟数部分<br> * 例如:10:04:15.250 =》 4 * * @param date 日期 * @return 分钟数 */ public static int minute(Date date) { return DateTime.of(date).minute(); } /** * 获得指定日期的秒数部分<br> * * @param date 日期 * @return 秒数 */ public static int second(Date date) { return DateTime.of(date).second(); } /** * 获得指定日期的毫秒数部分<br> * * @param date 日期 * @return 毫秒数 * @deprecated 拼写错误,请使用{@link #millisecond(Date)} */ @Deprecated public static int millsecond(Date date) { return DateTime.of(date).millisecond(); } /** * 获得指定日期的毫秒数部分<br> * * @param date 日期 * @return 毫秒数 */ public static int millisecond(Date date) { return DateTime.of(date).millisecond(); } /** * 是否为上午 * * @param date 日期 * @return 是否为上午 */ public static boolean isAM(Date date) { return DateTime.of(date).isAM(); } /** * 是否为下午 * * @param date 日期 * @return 是否为下午 */ public static boolean isPM(Date date) { return DateTime.of(date).isPM(); } /** * @return 今年 */ public static int thisYear() { return year(date()); } /** * @return 当前月份 */ public static int thisMonth() { return month(date()); } /** * @return 当前月份 {@link Month} */ public static Month thisMonthEnum() { return monthEnum(date()); } /** * @return 当前日期所在年份的第几周 */ public static int thisWeekOfYear() { return weekOfYear(date()); } /** * @return 当前日期所在月份的第几周 */ public static int thisWeekOfMonth() { return weekOfMonth(date()); } /** * @return 当前日期是这个日期所在月份的第几天 */ public static int thisDayOfMonth() { return dayOfMonth(date()); } /** * @return 当前日期是星期几 */ public static int thisDayOfWeek() { return dayOfWeek(date()); } /** * @return 当前日期是星期几 {@link Week} */ public static Week thisDayOfWeekEnum() { return dayOfWeekEnum(date()); } /** * @param is24HourClock 是否24小时制 * @return 当前日期的小时数部分<br> */ public static int thisHour(boolean is24HourClock) { return hour(date(), is24HourClock); } /** * @return 当前日期的分钟数部分<br> */ public static int thisMinute() { return minute(date()); } /** * @return 当前日期的秒数部分<br> */ public static int thisSecond() { return second(date()); } /** * @return 当前日期的毫秒数部分<br> * @deprecated 拼写错误,请使用{@link #thisMillisecond()} */ @Deprecated public static int thisMillsecond() { return millisecond(date()); } /** * @return 当前日期的毫秒数部分<br> */ public static int thisMillisecond() { return millisecond(date()); } // -------------------------------------------------------------- Part of Date end /** * 获得指定日期年份和季节<br> * 格式:[20131]表示2013年第一季度 * * @param date 日期 * @return Quarter ,类似于 20132 */ public static String yearAndQuarter(Date date) { return yearAndQuarter(calendar(date)); } /** * 获得指定日期区间内的年份和季节<br> * * @param startDate 起始日期(包含) * @param endDate 结束日期(包含) * @return 季度列表 ,元素类似于 20132 */ public static LinkedHashSet<String> yearAndQuarter(Date startDate, Date endDate) { if (startDate == null || endDate == null) { return new LinkedHashSet<>(0); } return yearAndQuarter(startDate.getTime(), endDate.getTime()); }
时间DateUtil
最新推荐文章于 2025-03-10 18:14:24 发布