Java Date计算、格式化工具类

Java Date计算、格式化工具类

前言

写项目的时候用到Date计算,比如获取最近一个月的数据,那么就要用当前的日期计算出30天前的日期,再放到SQL中查询。虽然以前也计算过,但是老是忘,每次用到都要搜一下,于是我就想要不直接搞个工具类出来,就不用老是搜来搜去了,而且还能加深这方面的映像,于是就有了这篇博客。

Date计算

我是用时间戳来计算的,Date类有一个getTime()方法,就是获取时间戳,这里获取的时间戳单位是毫秒,比如要算30天前的日期,我们只要用当前时间的时间戳减去用毫秒换算的30天(1000*60*60*24*30 ms) 就可以得到,代码如下:

public static Date getDateMonthAgo(Date date) {
	return new Date(date.getTime() - 1000L*60*60*24*30);
}

在这里插入图片描述

注意:计算时间戳时一定要有一个数值是long类型,否则会默认减数结果是一个int类型的值,可能会出现溢出问题,然后随出来的会变成负数,这时就会发现算到的时间不是30天前,而是30天后

由此可见,一天就是1000*60*60*24,一周就是1000*60*60*24*7,其他时间以此类推就行了,算多少天后减号换成加号就行了
也可以像我一样把这些年月日什么鬼都定义成一个常量:

/* 1秒 */
private static final long SECOND = 1000L;

/* 1分 */
private static final long MINUTE = 1000*60L;

/* 1小时 */
private static final long HOUR = 1000*60*60L;

/* 1天 */
private static final long DAY = 1000*60*60*24L;

/* 1周 */
private static final long WEEK = 1000*60*60*24*7L;

/* 1个月 */
private static final long MONTH = 1000*60*60*24*30L;

/* 1年 */
private static final long YEAR = 1000*60*60*24*365L;

这样编写方法的时候就比较有好一点吧应该:

/**
 * 获取days天后的日期
 * @param date 传入的日期
 * @param days 天数
 * @return days天后的日期
 */
public static Date getDateDaysAfter(Date date, int days) {
	return new Date(date.getTime() + DAY * days);
}

Date格式化

这个时候就有一个类要出场了,它就是SimpleDateFormat
我们可以用这个类定义日期时间的格式,在用里面的方法对Date转换成定义的格式

	public static String getDateFormatTest(Date date) {
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒");
		return sdf.format(date);
	}

在这里插入图片描述

编码描述
yyyy年份
yy年份后两位
MM月份
MMM中文大写月份
dd几号
HH24小时制
hh12小时制
mm分钟
ss
ms毫秒

当然这些格式也可以定义成常量调用就完事儿了:

/**
 * 日期格式
 * 可继续添加自定义格式,小时使用 HH 是24小时制,hh 是12小时制
 */
private static final String DATE_FORMAT_CHINESE = "yyyy年MM月dd日";

private static final String DATETIME_FORMAT_CHINESE = "yyyy年MM月dd日 HH时mm分ss秒";

private static final String DATE_FORMAT_WITH_LINE = "yyyy-MM-dd";

private static final String DATETIME_FORMAT_WITH_LINE = "yyyy-MM-dd HH:mm:ss";

private static final String DATE_FORMAT_WITH_SLASH  = "yyyy/MM/dd";

private static final String DATETIME_FORMAT_WITH_SLASH = "yyyy/MM/dd HH:mm:ss";

private static final String DATE_FORMAT  = "yyyyMMdd";

private static final String DATETIME_FORMAT = "yyyyMMdd HHmmss";

结尾

在我即将完成这个工具类时,突然好奇为什么Date的getDays()这类方法为什么不推荐用了,于是我看到了Java8新特性:LocalDate, LocalTime, LocalDateTime, DateFormatter…
原来是SimpleDateFormat线程不安全,转换时可能Date不对啥的,就搞了几个新的类出来,而且那几个类还挺好用,自带计算方法,我直接当场裂开。不过还有些就项目还是用的Date,所以还可以凑活着用,如果是新项目的话,就直接用这些新的类别,DateFormatter是线程安全的

这个工具类代码

package icu.sanjin.util;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
 * Date计算、格式化工具类
 * @author 三金
 * @since 2021-12-28 14:40
 * <p>个人博客:https://blog.csdn.net/qq_16186465</p>
 * 备注:Date和SimpleDateFormat都是比较过时的类了,因为SimpleDateFormat线程不安全,淦,又要学新的东西
 * JAVA8新特性中加入了LocalDate和DateFormatter等一些处理时间的类
 * 现在当事人十分的后悔,不过写都写了,也不能浪费了,嘿嘿
 */
public class DateUtil {

	/* 1秒 */
	private static final long SECOND = 1000L;

	/* 1分 */
	private static final long MINUTE = 1000*60L;

	/* 1小时 */
	private static final long HOUR = 1000*60*60L;

	/* 1天 */
	private static final long DAY = 1000*60*60*24L;

	/* 1周 */
	private static final long WEEK = 1000*60*60*24*7L;

	/* 1个月 */
	private static final long MONTH = 1000*60*60*24*30L;

	/* 1年 */
	private static final long YEAR = 1000*60*60*24*365L;

	/**
	 * 日期格式
	 * 可继续添加自定义格式,小时使用 HH 是24小时制,hh 是12小时制
	 */
	private static final String DATE_FORMAT_CHINESE = "yyyy年MM月dd日";

	private static final String DATETIME_FORMAT_CHINESE = "yyyy年MM月dd日 HH时mm分ss秒";

	private static final String DATE_FORMAT_WITH_LINE = "yyyy-MM-dd";

	private static final String DATETIME_FORMAT_WITH_LINE = "yyyy-MM-dd HH:mm:ss";

	private static final String DATE_FORMAT_WITH_SLASH  = "yyyy/MM/dd";

	private static final String DATETIME_FORMAT_WITH_SLASH = "yyyy/MM/dd HH:mm:ss";

	private static final String DATE_FORMAT  = "yyyyMMdd";

	private static final String DATETIME_FORMAT = "yyyyMMdd HHmmss";

	/**
	 * 获取明天日期
	 * @param date 传入的日期
	 * @return 明天的日期
	 */
	public static Date getDateTomorrow(Date date) {
		return new Date(date.getTime() + DAY);
	}

	/**
	 * 获取昨天的日期
	 * @param date 传入的时间
	 * @return 昨天的日期
	 */
	public static Date getDateYesterday(Date date) {
		return new Date(date.getTime() - DAY);
	}

	/**
	 * 获取days天前的日期
	 * @param date 传入的日期
	 * @param days 天数
	 * @return days天前的日期
	 */
	public static Date getDateDaysAgo(Date date, int days) {
		return new Date(date.getTime() - DAY * days);
	}

	/**
	 * 获取days天后的日期
	 * @param date 传入的日期
	 * @param days 天数
	 * @return days天后的日期
	 */
	public static Date getDateDaysAfter(Date date, int days) {
		return new Date(date.getTime() + DAY * days);
	}

	/**
	 * 获取weeks周前的日期
	 * @param date 传入的日期
	 * @param weeks 周数
	 * @return weeks周前的日期
	 */
	public static Date getDateWeeksAgo(Date date, int weeks) {
		return new Date(date.getTime() - WEEK * weeks);
	}

	/**
	 * 获取weeks周后的日期
	 * @param date 传入的日期
	 * @param weeks 周数
	 * @return weeks周后的日期
	 */
	public static Date getDateWeeksAfter(Date date, int weeks) {
		return new Date(date.getTime() + WEEK * weeks);
	}

	/**
	 * 获取months月前的日期
	 * @param date 传入的日期
	 * @param months 月数
	 * @return months月前的日期
	 */
	public static Date getDateMonthsAgo(Date date, int months) {
		return new Date(date.getTime() - MONTH * months);
	}

	/**
	 * 获取months月后的日期
	 * @param date 传入的日期
	 * @param months 月数
	 * @return months月后的日期
	 */
	public static Date getDateMonthsAfter(Date date, int months) {
		return new Date(date.getTime() + MONTH * months);
	}

	/**
	 * 获取years年前的日期
	 * @param date 传入的日期
	 * @param years 年数
	 * @return years年前的日期
	 */
	public static Date getDateAYearsAgo(Date date, int years) {
		return new Date(date.getTime() - YEAR * years);
	}

	/**
	 * 获取years年后的日期
	 * @param date 传入的日期
	 * @param years 年数
	 * @return years年后的日期
	 */
	public static Date getDateAYearsAfter(Date date, int years) {
		return new Date(date.getTime() + YEAR * years);
	}

	/**
	 * 获取中文格式的日期
	 * @param date 传入的日期
	 * @return 中文格式的日期
	 */
	public static String getDateFormatChinese(Date date) {
		SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT_CHINESE);
		return sdf.format(date);
	}

	/**
	 * 获取中文格式的日期时间
	 * @param date 传入的日期时间
	 * @return 中文格式的日期时间
	 */
	public static String getDatetimeFormatChinese(Date date) {
		SimpleDateFormat sdf = new SimpleDateFormat(DATETIME_FORMAT_CHINESE);
		return sdf.format(date);
	}

	/**
	 * 获取用-隔开的日期
	 * @param date 传入的日期
	 * @return 用-隔开的日期
	 */
	public static String getDateFormatWithLine(Date date) {
		SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT_WITH_LINE);
		return sdf.format(date);
	}

	/**
	 * 获取用-隔开的日期时间
	 * @param date 传入的日期时间
	 * @return 用-隔开的日期时间
	 */
	public static String getDatetimeFormatWithLine(Date date) {
		SimpleDateFormat sdf = new SimpleDateFormat(DATETIME_FORMAT_WITH_LINE);
		return sdf.format(date);
	}

	/**
	 * 获取用/隔开的日期
	 * @param date 传入的日期
	 * @return 用/隔开的日期
	 */
	public static String getDateFormatWithSlash(Date date) {
		SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT_WITH_SLASH);
		return sdf.format(date);
	}

	/**
	 * 获取用/隔开的日期时间
	 * @param date 传入的日期时间
	 * @return 用/隔开的日期时间
	 */
	public static String getDatetimeFormatWithSlash(Date date) {
		SimpleDateFormat sdf = new SimpleDateFormat(DATETIME_FORMAT_WITH_SLASH);
		return sdf.format(date);
	}

	/**
	 * 获取年月日在一坨的日期
	 * @param date 传入的日期
	 * @return 年月日在一坨的日期
	 */
	public static String getDateFormat(Date date) {
		SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT);
		return sdf.format(date);
	}

	/**
	 * 获取年月日时分秒在一坨的日期时间
	 * @param date 传入的日期时间
	 * @return 年月日时分秒在一坨的日期时间
	 */
	public static String getDatetimeFormat(Date date) {
		SimpleDateFormat sdf = new SimpleDateFormat(DATETIME_FORMAT);
		return sdf.format(date);
	}

	/**
	 * 自定义日期时间格式
	 * @param date 传入的日期时间
	 * @param dateFormat 自定义日期时间格式
	 * @return 自定义的日期时间
	 */
	public static String getDateFormatYourself(Date date, String dateFormat) {
		SimpleDateFormat sdf = new SimpleDateFormat(dateFormat);
		return sdf.format(date);
	}

	/**
	 * 分割时间,直接获取到所有部分
	 * @param date 传入的时间
	 * @return 时间的所有部位
	 */
	public static Map<String, String> splitDate(Date date) {
		Map<String, String> map = new HashMap<>();
		map.put("second", getDateFormatYourself(date, "ss"));
		map.put("minute", getDateFormatYourself(date, "mm"));
		map.put("hour", getDateFormatYourself(date, "HH"));
		map.put("day", getDateFormatYourself(date, "dd"));
		map.put("month", getDateFormatYourself(date, "MM"));
		map.put("year", getDateFormatYourself(date, "yyyy"));
		return map;
	}

	/**
	 * 获取秒数
	 * @param date 传入的时间
	 * @return 秒数
	 */
	public static String getSecond(Date date) {
		SimpleDateFormat sdf = new SimpleDateFormat("ss");
		return sdf.format(date);
	}

	/**
	 * 获取分钟
	 * @param date 传入的时间
	 * @return 分钟
	 */
	public static String getMinute(Date date) {
		SimpleDateFormat sdf = new SimpleDateFormat("mm");
		return sdf.format(date);
	}

	/**
	 * 获取小时
	 * @param date 传入的时间
	 * @return 小时
	 */
	public static String getHour(Date date) {
		SimpleDateFormat sdf = new SimpleDateFormat("hh");
		return sdf.format(date);
	}

	/**
	 * 获取号数
	 * @param date 传入的时间
	 * @return 号数
	 */
	public static String getDay(Date date) {
		SimpleDateFormat sdf = new SimpleDateFormat("dd");
		return sdf.format(date);
	}

	/**
	 * 获取月份
	 * @param date 传入的时间
	 * @return 月份
	 */
	public static String getMonth(Date date) {
		SimpleDateFormat sdf = new SimpleDateFormat("MM");
		return sdf.format(date);
	}

	/**
	 * 获取年份
	 * @param date 传入的时间
	 * @return 年份
	 */
	public static String getYear(Date date) {
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy");
		return sdf.format(date);
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

1594231563

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值