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 | 几号 |
HH | 24小时制 |
hh | 12小时制 |
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);
}
}