Java-Class-C:cn.hutool.core.date.DateUtil
2020-12-13 04:04
                         标签:当前日期   支持   dateutil   日期转换   第一天   相同   style   image   method     
 ylbtech-Java-Class-C:cn.hutool.core.date.DateUtil 
 1.返回顶部  
 
2.返回顶部
 
 
3.返回顶部
 
 
4.返回顶部
 
package cn.hutool.core.date;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.LinkedHashSet;
import java.util.List;
import cn.hutool.core.collection.CollUtil;
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;
import cn.hutool.core.lang.Validator;
import cn.hutool.core.util.StrUtil;
/**
 * 时间工具类
 * 
 * @author xiaoleilu
 */
public class DateUtil {
    /**
     * 转换为{@link DateTime}对象
     * 
     * @return 当前时间
     */
    public static DateTime date() {
        return new DateTime();
    }
    /**
     * {@link Date}类型时间转为{@link 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 new DateTime(date);
    }
    /**
     * Long类型时间转为{@link DateTime}
     * 只支持毫秒级别时间戳,如果需要秒级别时间戳,请自行×1000
     * 
     * @param date Long类型Date(Unix时间戳)
     * @return 时间对象
     */
    public static DateTime date(long date) {
        return new DateTime(date);
    }
    /**
     * {@link Calendar}类型时间转为{@link DateTime}
     * 
     * @param calendar {@link Calendar}
     * @return 时间对象
     */
    public static DateTime date(Calendar calendar) {
        return new DateTime(calendar);
    }
    /**
     * 转换为Calendar对象
     * 
     * @param date 日期对象
     * @return Calendar对象
     */
    public static Calendar calendar(Date date) {
        return calendar(date.getTime());
    }
    /**
     * 转换为Calendar对象
     * 
     * @param millis 时间戳
     * @return Calendar对象
     */
    public static Calendar calendar(long millis) {
        final Calendar cal = Calendar.getInstance();
        cal.setTimeInMillis(millis);
        return cal;
    }
    /**
     * 当前时间,格式 yyyy-MM-dd HH:mm:ss
     * 
     * @return 当前时间的标准形式字符串
     */
    public static String now() {
        return formatDateTime(new DateTime());
    }
    /**
     * 当前时间的时间戳
     * 
     * @param isNano 是否为高精度时间
     * @return 时间
     */
    public static long current(boolean isNano) {
        return isNano ? System.nanoTime() : System.currentTimeMillis();
    }
    /**
     * 当前时间的时间戳(秒)
     * 
     * @return 当前时间秒数
     * @since 4.0.0
     */
    public static long currentSeconds() {
        return System.currentTimeMillis() / 1000;
    }
    /**
     * 当前日期,格式 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();
    }
    /**
     * 获得指定日期所属季度
     * 
     * @param date 日期
     * @return 第几个季度
     * @deprecated 请使用{@link #quarter(Date)}
     */
    @Deprecated
    public static int season(Date date) {
        return quarter(date);
    }
    /**
     * 获得指定日期所属季度,从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();
    }
    /**
     * 获得指定日期是所在年份的第几周
     * 
     * @param date 日期
     * @return 周
     */
    public static int weekOfYear(Date date) {
        return DateTime.of(date).weekOfYear();
    }
    /**
     * 获得指定日期是所在月份的第几周
     * 
     * @param date 日期
     * @return 周
     */
    public static int weekOfMonth(Date date) {
        return DateTime.of(date).weekOfMonth();
    }
    /**
     * 获得指定日期是这个日期所在月份的第几天
     * 
     * @param date 日期
     * @return 天
     */
    public static int dayOfMonth(Date date) {
        return DateTime.of(date).dayOfMonth();
    }
    /**
     * 获得指定日期是星期几,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();
    }
    /**
     * 获得指定日期的小时数部分
     * 
     * @param date 日期
     * @param is24HourClock 是否24小时制
     * @return 小时数
     */
    public static int hour(Date date, boolean is24HourClock) {
        return DateTime.of(date).hour(is24HourClock);
    }
    /**
     * 获得指定日期的分钟数部分
     * 例如:10:04:15.250 =》 4
     * 
     * @param date 日期
     * @return 分钟数
     */
    public static int minute(Date date) {
        return DateTime.of(date).minute();
    }
    /**
     * 获得指定日期的秒数部分
     * 
     * @param date 日期
     * @return 秒数
     */
    public static int second(Date date) {
        return DateTime.of(date).second();
    }
    /**
     * 获得指定日期的毫秒数部分
     * 
     * @param date 日期
     * @return 毫秒数
     */
    public static int millsecond(Date date) {
        return DateTime.of(date).millsecond();
    }
    /**
     * 是否为上午
     * 
     * @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 当前日期的小时数部分
*/
    public static int thisHour(boolean is24HourClock) {
        return hour(date(), is24HourClock);
    }
    /**
     * @return 当前日期的分钟数部分
*/
    public static int thisMinute() {
        return minute(date());
    }
    /**
     * @return 当前日期的秒数部分
*/
    public static int thisSecond() {
        return second(date());
    }
    /**
     * @return 当前日期的毫秒数部分
*/
    public static int thisMillsecond() {
        return millsecond(date());
    }
    // -------------------------------------------------------------- Part of Date end
    /**
     * 获得指定日期年份和季节
     * 格式:[20131]表示2013年第一季度
     * 
     * @param date 日期
     * @return Season ,类似于 20132
     * @deprecated 请使用{@link #yearAndQuarter} 代替
     */
    @Deprecated
    public static String yearAndSeason(Date date) {
        return yearAndSeason(calendar(date));
    }
    /**
     * 获得指定日期年份和季节
     * 格式:[20131]表示2013年第一季度
     * 
     * @param date 日期
     * @return Quarter ,类似于 20132
     */
    public static String yearAndQuarter(Date date) {
        return yearAndQuarter(calendar(date));
    }
    /**
     * 获得指定日期区间内的年份和季节
     * 
     * @param startDate 起始日期(包含)
     * @param endDate 结束日期(包含)
     * @return Season列表 ,元素类似于 20132
     * @deprecated 请使用{@link #yearAndQuarter} 代替
     */
    @Deprecated
    public static LinkedHashSet
     * 
     * @param startDate 起始日期(包含)
     * @param endDate 结束日期(包含)
     * @return 季度列表 ,元素类似于 20132
     */
    public static LinkedHashSet
     * 
     * @param startDate 起始日期(包含)
     * @param endDate 结束日期(包含)
     * @return 季度列表 ,元素类似于 20132
     * @since 4.1.15
     */
    public static LinkedHashSet
     * 格式 yyyy-MM-dd HH:mm:ss
     * 
     * @param date 被格式化的日期
     * @return 格式化后的日期
     */
    public static String formatDateTime(Date date) {
        if (null == date) {
            return null;
        }
        return DatePattern.NORM_DATETIME_FORMAT.format(date);
    }
    /**
     * 格式化日期部分(不包括时间)
     * 格式 yyyy-MM-dd
     * 
     * @param date 被格式化的日期
     * @return 格式化后的字符串
     */
    public static String formatDate(Date date) {
        if (null == date) {
            return null;
        }
        return DatePattern.NORM_DATE_FORMAT.format(date);
    }
    /**
     * 格式化时间
     * 格式 HH:mm:ss
     * 
     * @param date 被格式化的日期
     * @return 格式化后的字符串
     * @since 3.0.1
     */
    public static String formatTime(Date date) {
        if (null == date) {
            return null;
        }
        return DatePattern.NORM_TIME_FORMAT.format(date);
    }
    /**
     * 格式化为Http的标准日期格式
     * 
     * @param date 被格式化的日期
     * @return HTTP标准形式日期字符串
     */
    public static String formatHttpDate(Date date) {
        if (null == date) {
            return null;
        }
        return DatePattern.HTTP_DATETIME_FORMAT.format(date);
    }
    /**
     * 格式化为中文日期格式,如果isUppercase为false,则返回类似:2018年10月24日,否则返回二〇一八年十月二十四日
     * 
     * @param date 被格式化的日期
     * @param isUppercase 是否采用大写形式
     * @return 中文日期字符串
     * @since 4.1.19
     */
    public static String formatChineseDate(Date date, boolean isUppercase) {
        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.substring(4, 5));
            builder.append(Convert.numberToChinese(Integer.parseInt(format.substring(5, 7)), false));
            builder.append(format.substring(7, 8));
            builder.append(Convert.numberToChinese(Integer.parseInt(format.substring(8, 10)), false));
            builder.append(format.substring(10));
            format = builder.toString().replace(‘零‘, ‘〇‘);
        }
        return format;
    }
    // ------------------------------------ Format end ----------------------------------------------
    // ------------------------------------ Parse start ----------------------------------------------
    /**
     * 构建DateTime对象
     * 
     * @param dateStr Date字符串
     * @param dateFormat 格式化器 {@link SimpleDateFormat}
     * @return DateTime对象
     */
    public static DateTime parse(String dateStr, DateFormat dateFormat) {
        return new DateTime(dateStr, dateFormat);
    }
    /**
     * 构建DateTime对象
     * 
     * @param dateStr Date字符串
     * @param parser 格式化器,{@link FastDateFormat}
     * @return DateTime对象
     */
    public static DateTime parse(String dateStr, DateParser parser) {
        return new DateTime(dateStr, parser);
    }
    /**
     * 将特定格式的日期转换为Date对象
     * 
     * @param dateStr 特定格式的日期
     * @param format 格式,例如yyyy-MM-dd
     * @return 日期对象
     */
    public static DateTime parse(String dateStr, String format) {
        return new DateTime(dateStr, format);
    }
    /**
     * 格式yyyy-MM-dd HH:mm:ss
     * 
     * @param dateString 标准形式的时间字符串
     * @return 日期对象
     */
    public static DateTime parseDateTime(String dateString) {
        dateString = normalize(dateString);
        return parse(dateString, DatePattern.NORM_DATETIME_FORMAT);
    }
    /**
     * 格式yyyy-MM-dd
     * 
     * @param dateString 标准形式的日期字符串
     * @return 日期对象
     */
    public static DateTime parseDate(String dateString) {
        dateString = normalize(dateString);
        return parse(dateString, DatePattern.NORM_DATE_FORMAT);
    }
    /**
     * 解析时间,格式HH:mm:ss,默认为1970-01-01
     * 
     * @param timeString 标准形式的日期字符串
     * @return 日期对象
     */
    public static DateTime parseTime(String timeString) {
        timeString = normalize(timeString);
        return parse(timeString, DatePattern.NORM_TIME_FORMAT);
    }
    /**
     * 解析时间,格式HH:mm:ss,日期默认为今天
     * 
     * @param timeString 标准形式的日期字符串
     * @return 日期对象
     * @since 3.1.1
     */
    public static DateTime parseTimeToday(String timeString) {
        timeString = StrUtil.format("{} {}", today(), timeString);
        return parse(timeString, DatePattern.NORM_DATETIME_FORMAT);
    }
    /**
     * 解析UTC时间,格式为:yyyy-MM-dd‘T‘HH:mm:ss‘Z
     * 
     * @param utcString UTC时间
     * @return 日期对象
     * @since 4.1.14
     */
    public static DateTime parseUTC(String utcString) {
        return parse(utcString, DatePattern.UTC_FORMAT);
    }
    /**
     * 将日期字符串转换为{@link DateTime}对象,格式:
     * 
     * 
     * 
     * @param dateStr 日期字符串
     * @return 日期
     */
    public static DateTime parse(String dateStr) {
        if (null == dateStr) {
            return null;
        }
        // 去掉两边空格并去掉中文日期中的“日”,以规范长度
        dateStr = dateStr.trim().replace("日", "");
        int length = dateStr.length();
        if (Validator.isNumber(dateStr)) {
            // 纯数字形式
            if (length == DatePattern.PURE_DATETIME_PATTERN.length()) {
                return parse(dateStr, DatePattern.PURE_DATETIME_FORMAT);
            } else if (length == DatePattern.PURE_DATETIME_MS_PATTERN.length()) {
                return parse(dateStr, DatePattern.PURE_DATETIME_MS_FORMAT);
            } else if (length == DatePattern.PURE_DATE_PATTERN.length()) {
                return parse(dateStr, DatePattern.PURE_DATE_FORMAT);
            } else if (length == DatePattern.PURE_TIME_PATTERN.length()) {
                return parse(dateStr, DatePattern.PURE_TIME_FORMAT);
            }
        }
        if (length == DatePattern.NORM_DATETIME_PATTERN.length() || length == DatePattern.NORM_DATETIME_PATTERN.length() + 1) {
            if(dateStr.contains("T")) {
                //UTC时间格式:类似2018-09-13T05:34:31
                return parseUTC(dateStr);
            }
            return parseDateTime(dateStr);
        } else if (length == DatePattern.NORM_DATE_PATTERN.length()) {
            return parseDate(dateStr);
        } else if (length == DatePattern.NORM_TIME_PATTERN.length() || length == DatePattern.NORM_TIME_PATTERN.length() + 1) {
            return parseTimeToday(dateStr);
        } else if (length == DatePattern.NORM_DATETIME_MINUTE_PATTERN.length() || length == DatePattern.NORM_DATETIME_MINUTE_PATTERN.length() + 1) {
            return parse(normalize(dateStr), DatePattern.NORM_DATETIME_MINUTE_FORMAT);
        } else if (length >= DatePattern.NORM_DATETIME_MS_PATTERN.length() - 2) {
            return parse(normalize(dateStr), DatePattern.NORM_DATETIME_MS_FORMAT);
        }
        // 没有更多匹配的时间格式
        throw new DateException("No format fit for date String [{}] !", dateStr);
    }
    // ------------------------------------ Parse end ----------------------------------------------
    // ------------------------------------ Offset start ----------------------------------------------
    /**
     * 获取某天的开始时间
     * 
     * @param date 日期
     * @return {@link DateTime}
     */
    public static DateTime beginOfDay(Date date) {
        return new DateTime(beginOfDay(calendar(date)));
    }
    /**
     * 获取某天的结束时间
     * 
     * @param date 日期
     * @return {@link DateTime}
     */
    public static DateTime endOfDay(Date date) {
        return new DateTime(endOfDay(calendar(date)));
    }
    /**
     * 获取某天的开始时间
     * 
     * @param calendar 日期 {@link Calendar}
     * @return {@link Calendar}
     */
    public static Calendar beginOfDay(Calendar calendar) {
        calendar.set(Calendar.HOUR_OF_DAY, 0);
        calendar.set(Calendar.MINUTE, 0);
        calendar.set(Calendar.SECOND, 0);
        calendar.set(Calendar.MILLISECOND, 0);
        return calendar;
    }
    /**
     * 获取某天的结束时间
     * 
     * @param calendar 日期 {@link Calendar}
     * @return {@link Calendar}
     */
    public static Calendar endOfDay(Calendar calendar) {
        calendar.set(Calendar.HOUR_OF_DAY, 23);
        calendar.set(Calendar.MINUTE, 59);
        calendar.set(Calendar.SECOND, 59);
        calendar.set(Calendar.MILLISECOND, 999);
        return calendar;
    }
    /**
     * 获取某周的开始时间
     * 
     * @param date 日期
     * @return {@link DateTime}
     */
    public static DateTime beginOfWeek(Date date) {
        return new DateTime(beginOfWeek(calendar(date)));
    }
    /**
     * 获取某周的结束时间
     * 
     * @param date 日期
     * @return {@link DateTime}
     */
    public static DateTime endOfWeek(Date date) {
        return new DateTime(endOfWeek(calendar(date)));
    }
    /**
     * 获取某周的开始时间
     * 
     * @param calendar 日期 {@link Calendar}
     * @return {@link Calendar}
     */
    public static Calendar beginOfWeek(Calendar calendar) {
        return beginOfWeek(calendar, true);
    }
    /**
     * 获取某周的开始时间,周一定为一周的开始时间
     * 
     * @param calendar 日期 {@link Calendar}
     * @param isMondayAsFirstDay 是否周一做为一周的第一天(false表示周日做为第一天)
     * @return {@link Calendar}
     * @since 3.1.2
     */
    public static Calendar beginOfWeek(Calendar calendar, boolean isMondayAsFirstDay) {
        if (isMondayAsFirstDay) {
            // 设置周一为一周开始
            calendar.setFirstDayOfWeek(Week.MONDAY.getValue());
            calendar.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
        } else {
            calendar.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY);
        }
        return beginOfDay(calendar);
    }
    /**
     * 获取某周的结束时间,周日定为一周的结束
     * 
     * @param calendar 日期 {@link Calendar}
     * @return {@link Calendar}
     */
    public static Calendar endOfWeek(Calendar calendar) {
        return endOfWeek(calendar, true);
    }
    /**
     * 获取某周的结束时间
     * 
     * @param calendar 日期 {@link Calendar}
     * @param isSundayAsLastDay 是否周日做为一周的最后一天(false表示周六做为最后一天)
     * @return {@link Calendar}
     * @since 3.1.2
     */
    public static Calendar endOfWeek(Calendar calendar, boolean isSundayAsLastDay) {
        if (isSundayAsLastDay) {
            // 设置周一为一周开始
            calendar.setFirstDayOfWeek(Week.MONDAY.getValue());
            calendar.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY);
        } else {
            calendar.set(Calendar.DAY_OF_WEEK, Calendar.SATURDAY);
        }
        return endOfDay(calendar);
    }
    /**
     * 获取某月的开始时间
     * 
     * @param date 日期
     * @return {@link DateTime}
     */
    public static DateTime beginOfMonth(Date date) {
        return new DateTime(beginOfMonth(calendar(date)));
    }
    /**
     * 获取某月的结束时间
     * 
     * @param date 日期
     * @return {@link DateTime}
     */
    public static DateTime endOfMonth(Date date) {
        return new DateTime(endOfMonth(calendar(date)));
    }
    /**
     * 获取某月的开始时间
     * 
     * @param calendar 日期 {@link Calendar}
     * @return {@link Calendar}
     */
    public static Calendar beginOfMonth(Calendar calendar) {
        calendar.set(Calendar.DAY_OF_MONTH, 1);
        return beginOfDay(calendar);
    }
    /**
     * 获取某月的结束时间
     * 
     * @param calendar 日期 {@link Calendar}
     * @return {@link Calendar}
     */
    public static Calendar endOfMonth(Calendar calendar) {
        calendar.set(Calendar.DAY_OF_MONTH, calendar.getActualMaximum(Calendar.DAY_OF_MONTH));
        return endOfDay(calendar);
    }
    /**
     * 获取某季度的开始时间
     * 
     * @param date 日期
     * @return {@link DateTime}
     */
    public static DateTime beginOfQuarter(Date date) {
        return new DateTime(beginOfQuarter(calendar(date)));
    }
    /**
     * 获取某季度的结束时间
     * 
     * @param date 日期
     * @return {@link DateTime}
     */
    public static DateTime endOfQuarter(Date date) {
        return new DateTime(endOfQuarter(calendar(date)));
    }
    /**
     * 获取某季度的开始时间
     * 
     * @param calendar 日期 {@link Calendar}
     * @return {@link Calendar}
     * @since 4.1.0
     */
    public static Calendar beginOfQuarter(Calendar calendar) {
        calendar.set(Calendar.MONTH, calendar.get(DateField.MONTH.getValue()) / 3 * 3);
        calendar.set(Calendar.DAY_OF_MONTH, 1);
        return beginOfDay(calendar);
    }
    /**
     * 获取某季度的结束时间
     * 
     * @param calendar 日期 {@link Calendar}
     * @return {@link Calendar}
     * @since 4.1.0
     */
    public static Calendar endOfQuarter(Calendar calendar) {
        calendar.set(Calendar.MONTH, calendar.get(DateField.MONTH.getValue()) / 3 * 3 + 2);
        calendar.set(Calendar.DAY_OF_MONTH, calendar.getActualMaximum(Calendar.DAY_OF_MONTH));
        return endOfDay(calendar);
    }
    /**
     * 获取某年的开始时间
     * 
     * @param date 日期
     * @return {@link DateTime}
     */
    public static
上一篇:Json和JsonP的区别
文章标题:Java-Class-C:cn.hutool.core.date.DateUtil
文章链接:http://soscw.com/essay/28809.html