时间DateUtil

Hutool是一个Java工具包,本文主要介绍其核心模块`DateUtil`,提供日期时间的便捷操作,包括日期时间转换、获取日期时间部分、计算年龄等方法。DateUtil支持与多种时间对象互转,并提供了丰富的日期时间处理函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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());
   }
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值