java日期工具类(用于处理日期时间相关操作,例如日期格式化、日期计算等。)

package com.leng.demo.utils;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.TimeZone;

/*
 * DateUtils:用于处理日期时间相关操作,例如日期格式化、日期计算等。
 * */
public final class DateUtils {
    private DateUtils() {
    }

    /**
     * 将日期按指定格式转换为字符串
     *
     * @param date   日期对象
     * @param format 格式字符串
     * @return 返回格式化后的字符串
     */
    public static String format(Date date, String format) {
        // SimpleDateFormat不是线程安全的,局部变量避免并发问题
        SimpleDateFormat sdf = new SimpleDateFormat(format);
        return sdf.format(date);
    }

    /**
     * 计算指定日期加上指定天数后的日期
     *
     * @param date 要计算的日期
     * @param days 要加上的天数(正数表示加,负数表示减)
     * @return 返回计算后的日期对象
     */
    public static Date addDays(Date date, int days) {
        if (days == 0) {
            return date;
        }
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.add(Calendar.DAY_OF_MONTH, days);
        return calendar.getTime();
    }

    /**
     * 计算两个日期相差的天数
     *
     * @param start 开始日期
     * @param end   结束日期
     * @return 返回相差天数(可能为负数)
     */
    public static int diffDays(Date start, Date end) {
        // 注意时区问题,先将日期转换为UTC时间戳再计算
        long diff = convertToUTC(end, "GMT+8") - convertToUTC(start, "GMT+8");
        return (int) (diff / (24 * 60 * 60 * 1000));
    }

    /**
     * 计算指定日期加上指定小时数后的日期
     *
     * @param date  要计算的日期
     * @param hours 要加上的小时数(正数表示加,负数表示减)
     * @return 返回计算后的日期对象
     */
    public static Date addHours(Date date, int hours) {
        if (hours == 0) {
            return date;
        }
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.add(Calendar.HOUR_OF_DAY, hours);
        return calendar.getTime();
    }

    /**
     * 获取当前季度
     *
     * @return 返回1、2、3或4表示第一季度、第二季度、第三季度或第四季度
     */
    public static int getCurrentQuarter() {
        Calendar calendar = Calendar.getInstance();
        int month = calendar.get(Calendar.MONTH);
        if (month < 3) {
            return 1;
        } else if (month < 6) {
            return 2;
        } else if (month < 9) {
            return 3;
        } else {
            return 4;
        }
    }

    /**
     * 计算指定日期的年龄
     *
     * @param birthDate 出生日期
     * @return 返回年龄
     */
    public static int getAge(Date birthDate) {
        Calendar curCalendar = Calendar.getInstance();
        Calendar birthCalendar = Calendar.getInstance();
        birthCalendar.setTime(birthDate);

        int age = curCalendar.get(Calendar.YEAR) - birthCalendar.get(Calendar.YEAR);
        if (curCalendar.get(Calendar.MONTH) < birthCalendar.get(Calendar.MONTH)
                || (curCalendar.get(Calendar.MONTH) == birthCalendar.get(Calendar.MONTH)
                && curCalendar.get(Calendar.DAY_OF_MONTH) < birthCalendar.get(Calendar.DAY_OF_MONTH))) {
            age--;
        }
        return age;
    }

    /**
     * 将日期按指定时区转换为UTC标准时间
     *
     * @param date   要转换的日期对象
     * @param zoneId 时区ID字符串(例如"GMT+8")
     * @return 返回转换后的UTC时间戳
     */
    public static long convertToUTC(Date date, String zoneId) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        // 获取指定时区与UTC的偏移量
        int offset = TimeZone.getTimeZone(zoneId).getRawOffset();
        // 计算指定时间在UTC表示下的时间戳并返回
        return calendar.getTimeInMillis() - offset;
    }

    /**
     * 将UTC标准时间转换为指定时区的日期对象
     *
     * @param utcTime UTC时间戳
     * @param zoneId  时区ID字符串(例如"GMT+8")
     * @return 返回转换后的日期对象
     */
    public static Date convertToLocalDate(long utcTime, String zoneId) {
        Calendar calendar = Calendar.getInstance();
        // 计算指定UTC时间在指定时区下的时间戳
        calendar.setTimeInMillis(utcTime + TimeZone.getTimeZone(zoneId).getRawOffset());
        return calendar.getTime();
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值