在项目中,很多地方需要根据时间获取相应的数据,将时间格式化,或者时间比较等相关操作。一个良好的工具类不仅可以减少代码冗余,还能促进业务处理,加快进度。

/**
* @author: lxw
* @Date: 2018/12/25 14:36
* @Description: 时间工具类
*/
public class DateUtils {
/**
* 常用时间格式
*/
public final static String DATE_TIME_PATTERN = "yyyy-MM-dd HH:mm:ss"; public final static String MONTH_PATTERN = "yyyy-MM"; public final static String DATE_PATTERN = "yyyy-MM-dd"; public final static String HH_MM_SS = "HH:mm:ss"; public final static String DATE_PATTERN_YYYY_MM_DD_HH_MM = "yyyy-MM-dd HH:mm"; public static String DATE_TIME_PATTERN_YYYY_MM_DD_HH_MM_SS_SSS = "yyyyMMddHHmmssSSS"; public static String DATE_TIME_PATTERN_YYYY_MM_DD_HH_MM_SS = "yyyyMMddHHmmss"; /**
* 日期转换格式数组
*/
public static String[][] regularExp = new String[][]{ // 默认格式
{"\\d{4}-((([0][1,3-9]|[1][0-2]|[1-9])-([0-2]\\d|[3][0,1]|[1-9]))|((02|2)-(([1-9])|[0-2]\\d)))\\s+([0,1]\\d|[2][0-3]|\\d):([0-5]\\d|\\d):([0-5]\\d|\\d)",
DATE_TIME_PATTERN},
// 仅日期格式 年月日
{"\\d{4}-((([0][1,3-9]|[1][0-2]|[1-9])-([0-2]\\d|[3][0,1]|[1-9]))|((02|2)-(([1-9])|[0-2]\\d)))",
DATE_PATTERN},
// 带毫秒格式
{"\\d{4}((([0][1,3-9]|[1][0-2]|[1-9])([0-2]\\d|[3][0,1]|[1-9]))|((02|2)(([1-9])|[0-2]\\d)))([0,1]\\d|[2][0-3])([0-5]\\d|\\d)([0-5]\\d|\\d)\\d{1,3}",
DATE_TIME_PATTERN_YYYY_MM_DD_HH_MM_SS_SSS}
}; /**
* 日期转换为String类型
*
* @param date 日期
* @param pattern 获取格式
* @return String
*/
public static String format(Date date, String pattern) {
if (date != null) {
SimpleDateFormat df = new SimpleDateFormat(pattern);
return df.format(date);
}
return null;
} /**
* 日期转换为String类型,并添加或减少相应的天数
*
* @param date 日期
* @param pattern 获取格式
* @param amount 天数
* @return String
*/
public static String format(Date date, String pattern, int amount) {
if (date != null) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.add(Calendar.DAY_OF_MONTH, amount);
SimpleDateFormat df = new SimpleDateFormat(pattern);
return df.format(calendar.getTime());
}
return null;
} /**
* 字符串转换成日期
*
* @param strDate 日期字符串
* @param pattern 日期的格式
* @return data
*/
public static Date stringToDate(String strDate, String pattern) {
if (StringUtils.isBlank(strDate)) {
return null;
} DateTimeFormatter fmt = DateTimeFormat.forPattern(pattern);
return fmt.parseLocalDateTime(strDate).toDate();
} /**
* 两个时间之间的天数
*
* @param date1
* @param date2
* @param pattern 格式
* @return 天数
*/
public static long getDays(String date1, String date2, String pattern) {
SimpleDateFormat formatter = new SimpleDateFormat(pattern);
if (date1 == null || date1.equals("")) {
return 0;
}
if (date2 == null || date2.equals("")) {
return 0;
}
try {
Date date = formatter.parse(date1);
Date newDate = formatter.parse(date2);
return (date.getTime() - newDate.getTime()) / (24 * 60 * 60 * 1000);
} catch (Exception e) {
}
return 0;
} /**
* 产生周序列,即得到当前时间所在的年度是第几周
*
* @return
*/
public static String getSeqWeek() {
Calendar c = Calendar.getInstance(Locale.CHINA);
String week = Integer.toString(c.get(Calendar.WEEK_OF_YEAR));
if (week.length() == 1) {
week = "0" + week;
}
return week;
} /**
* 日期格式字符串转换成时间戳
*
* @param date_str 字符串日期
* @param format 日期格式,如:yyyy-MM-dd HH:mm:ss
* @return
*/
public static String dateTimeStamp(String date_str, String format) {
try {
SimpleDateFormat sdf = new SimpleDateFormat(format);
return String.valueOf(sdf.parse(date_str).getTime() / 1000);
} catch (Exception e) {
e.printStackTrace();
}
return "";
} /**
* 获取日期的格式
*
* @param date_str 日期格式字符串
* @return 当前日期格式
*/
public static String getDateFormat(String date_str) {
String style = null;
if (org.springframework.util.StringUtils.isEmpty(date_str)) {
return null;
}
boolean b = false;
for (int i = 0; i < regularExp.length; i++) {
b = date_str.matches(regularExp[i][0]);
if (b) {
style = regularExp[i][1];
}
}
if (org.springframework.util.StringUtils.isEmpty(style)) {
return null;
}
return style;
} /**
* 转换为时间类型格式
*
* @param strDate 日期
* @return
*/
public static Date strToDate(String strDate) {
try {
String strType = getDateFormat(strDate);
if (strType == null) {
return null;
}
SimpleDateFormat sf = new SimpleDateFormat(strType);
return new Date((sf.parse(strDate).getTime()));
} catch (Exception e) {
return null;
}
} /**
* 获取两个字符串时间差
*
* @param beginTime 开始时间
* @param endTime 结束时间
* @return xx小时xx分钟
*/
public static String timeLength(String beginTime, String endTime) {
if (beginTime == null || "".equals(beginTime)) {
return "";
}
if (endTime == null || "".equals(endTime)) {
return "";
}
Date begin = DateUtils.strToDate(beginTime);
Date end = DateUtils.strToDate(endTime);
if (begin == null || end == null) {
return "";
}
try {
//除以1000是为了转换成秒
long between = (end.getTime() - begin.getTime()) / 1000;
int day = (int) between / (24 * 3600);
int hour = (int) between % (24 * 3600) / 3600;
int minute = (int) between % 3600 / 60;
int currentHour = day * 24 + hour;
return currentHour + "小时" + minute + "分钟";
} catch (Exception e) {
return "";
}
} /**
* 判断是否润年
*
* @param date 日期
* @return boolean
*/
public static boolean isLeapYear(Date date) {
/**
* 1.被400整除是闰年
* 2.不能被4整除则不是闰年
* 3.能被4整除同时不能被100整除则是闰年
* 4.能被4整除同时能被100整除则不是闰年
*/
GregorianCalendar gc = (GregorianCalendar) Calendar.getInstance();
gc.setTime(date);
int year = gc.get(Calendar.YEAR);
if ((year % 400) == 0) {
return true;
} else if ((year % 4) == 0) {
if ((year % 100) == 0) {
return false;
} else {
return true;
}
} else {
return false;
}
} /**
* 取得当前时间生成格式为yyyymmddhhmmss+k位随机数
*
* @param k 随机数位数
*/
public static String getNo(int k) {
Date date = new Date();
return format(date, DATE_TIME_PATTERN_YYYY_MM_DD_HH_MM_SS) + getRandom(k);
} /**
* 返回一个随机数
*
* @param num 随机生成的位数
* @return
*/
public static String getRandom(int num) {
Random random = new Random();
if (num == 0) {
return "";
}
String randomNum = "";
for (int i = 0; i < num; i++) {
//取0-9的随机数进行拼接
randomNum += random.nextInt(9);
}
return randomNum;
} /**
* 根据周数,获取开始日期、结束日期
*
* @param week 周期 0本周,-1上周,-2上上周,1下周,2下下周
* @return 返回date[0]开始日期、date[1]结束日期
*/
public static Date[] getWeekStartAndEnd(int week) {
DateTime dateTime = new DateTime();
LocalDate date = new LocalDate(dateTime.plusWeeks(week)); date = date.dayOfWeek().withMinimumValue();
Date beginDate = date.toDate();
Date endDate = date.plusDays(6).toDate();
return new Date[]{beginDate, endDate};
} /**
* 对日期的【秒】进行加/减
*
* @param date 日期
* @param seconds 秒数,负数为减
* @return 加/减几秒后的日期
*/
public static Date addDateSeconds(Date date, int seconds) {
DateTime dateTime = new DateTime(date);
return dateTime.plusSeconds(seconds).toDate();
} /**
* 对日期的【分钟】进行加/减
*
* @param date 日期
* @param minutes 分钟数,负数为减
* @return 加/减几分钟后的日期
*/
public static Date addDateMinutes(Date date, int minutes) {
DateTime dateTime = new DateTime(date);
return dateTime.plusMinutes(minutes).toDate();
} /**
* 对日期的【小时】进行加/减
*
* @param date 日期
* @param hours 小时数,负数为减
* @return 加/减几小时后的日期
*/
public static Date addDateHours(Date date, int hours) {
DateTime dateTime = new DateTime(date);
return dateTime.plusHours(hours).toDate();
} /**
* 对日期的【天】进行加/减
*
* @param date 日期
* @param days 天数,负数为减
* @return 加/减几天后的日期
*/
public static Date addDateDays(Date date, int days) {
DateTime dateTime = new DateTime(date);
return dateTime.plusDays(days).toDate();
} /**
* 对日期的【周】进行加/减
*
* @param date 日期
* @param weeks 周数,负数为减
* @return 加/减几周后的日期
*/
public static Date addDateWeeks(Date date, int weeks) {
DateTime dateTime = new DateTime(date);
return dateTime.plusWeeks(weeks).toDate();
} /**
* 对日期的【月】进行加/减
*
* @param date 日期
* @param months 月数,负数为减
* @return 加/减几月后的日期
*/
public static Date addDateMonths(Date date, int months) {
DateTime dateTime = new DateTime(date);
return dateTime.plusMonths(months).toDate();
} /**
* 对日期的【年】进行加/减
*
* @param date 日期
* @param years 年数,负数为减
* @return 加/减几年后的日期
*/
public static Date addDateYears(Date date, int years) {
DateTime dateTime = new DateTime(date);
return dateTime.plusYears(years).toDate();
} /**
* 比较时间大小
*
* @param exprtime 时间1
* @param times 时间2
* @return 0:时间相等 1;时间1在时间2之后 -1:时间1在时间2之前
*/
public static int compareDate(String exprtime, String times) {
int result = 0;
//判断时间大小
if (exprtime != null && !"".equals(exprtime)) {
DateFormat dateFormat = new SimpleDateFormat(DATE_TIME_PATTERN);
try {
Date d1 = dateFormat.parse(exprtime);
Date d2 = dateFormat.parse(times);
if (d1.getTime() > d2.getTime()) {
System.out.println(d1 + "在" + d2 + "之后");
result = 1;
} else if (d1.getTime() < d2.getTime()) {
result = -1;
System.out.println(d1 + "在" + d2 + "之前");
} else {
System.out.println(d1 + "=" + d2);
}
} catch (ParseException e) {
e.printStackTrace();
System.out.println("方法——compareDate异常");
}
}
return result;
} /**
* 获取距离现在的天数
*
* @param exprtime 某天的时间字符串
* @return 天数
*/
public static long getDays(String exprtime) {
Date begin = DateUtils.strToDate(format(new Date(), DATE_TIME_PATTERN));
Date end = DateUtils.strToDate(exprtime);
long between = (end.getTime() - begin.getTime()) / 1000;
int day = (int) between / (24 * 3600);
return day;
}
```
测试类方法: ```
public static void main(String[] args) {
Date date = new Date();
String dateString = DateUtils.format(date, DATE_TIME_PATTERN);
System.out.println("时间格式转换为:" + dateString); String tomorrow = DateUtils.format(date, DATE_TIME_PATTERN, 1);
System.out.println("明天日期:" + tomorrow); Date stringToDate = DateUtils.stringToDate(dateString, DATE_TIME_PATTERN);
System.out.println("当天日期格式:" + stringToDate); boolean flag = DateUtils.isLeapYear(date);
System.out.println("当前是否为闰年:" + flag); long days = DateUtils.getDays(tomorrow, dateString, DATE_PATTERN);
System.out.println("天数相差:" + days + " 天"); String getSeqWeek = DateUtils.getSeqWeek();
System.out.println("今年第 " + getSeqWeek + " 周"); String randomNum = DateUtils.getNo(4);
System.out.println("编号:" + randomNum); String dateTimeStamp = DateUtils.dateTimeStamp(dateString, DATE_TIME_PATTERN);
System.out.println("当期时间戳:" + dateTimeStamp); String timeLength = DateUtils.timeLength(dateString, tomorrow);
System.out.println("相差时间:" + timeLength); String getDateFormat = DateUtils.getDateFormat(dateString);
System.out.println("当前日期格式:" + getDateFormat); String stmpString = DateUtils.stampToDate("1545732716");
System.out.println("当前日期:" + stmpString); String stmpLong = DateUtils.stampToDate(1545732716L);
System.out.println("当前日期:" + stmpLong); long day = DateUtils.getDays("2019-01-01 18:20:20");
System.out.println("距离当前时间:" + day + "天");
}

输出结果:

时间格式转换为:2018-12-25 18:21:23
明天日期:2018-12-26 18:21:23
当天日期格式:Tue Dec 25 18:21:23 CST 2018
当前是否为闰年:false
天数相差:1 天
今年第 52 周
编号:201812251821237084
当期时间戳:1545733283
相差时间:24小时0分钟
当前日期格式:yyyy-MM-dd HH:mm:ss
当前日期:1970-01-19 05:22:12
当前日期:1970-01-19 05:22:12
距离当前时间:6天

java时间工具类的更多相关文章

  1. Java日期工具类,Java时间工具类,Java时间格式化

    Java日期工具类,Java时间工具类,Java时间格式化 >>>>>>>>>>>>>>>>>&g ...

  2. 小记Java时间工具类

    小记Java时间工具类 废话不多说,这里主要记录以下几个工具 两个时间只差(Data) 获取时间的格式 格式化时间 返回String 两个时间只差(String) 获取两个时间之间的日期.月份.年份 ...

  3. 超详细的Java时间工具类

    package com.td.util; import java.sql.Timestamp; import java.text.ParseException; import java.text.Pa ...

  4. 一个好的Java时间工具类DateTime

    此类的灵感来源于C# 虽然网上有什么date4j,但是jar太纠结了,先给出源码,可以继承到自己的util包中,作为一个资深程序员,我相信都有不少好的util工具类,我也希望经过此次分享,能带动技术大 ...

  5. JAVA时间工具类,在维护的项目里的

    package com.inspur.jobSchedule.util; import org.apache.commons.lang3.time.DateUtils; import org.apac ...

  6. Java 时间工具类

    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  1.Calendar 转化 String  ...

  7. java时间工具类,时间相互转换

    /* * @author XueWeiWei * @date 2019/8/26 16:22 */ package com.nps.utils; import java.text.ParseExcep ...

  8. JAVA时间工具类用法

    1.获得N天前的TIMESTAMP Calendar cl = Calendar.getInstance(); cl.add(Calendar.DAY_OF_YEAR, -7); Date date ...

  9. 代码片段:基于 JDK 8 time包的时间工具类 TimeUtil

    摘要: 原创出处:www.bysocket.com 泥瓦匠BYSocket 希望转载,保留摘要,谢谢! “知识的工作者必须成为自己时间的首席执行官.” 前言 这次泥瓦匠带来的是一个好玩的基于 JDK ...

随机推荐

  1. ListView ,GridView 通用适配器

    前言 接近半年的时间没有写博客了,今年公司的项目有点多,比较忙,没时间写,这是其一.其次是,这半年来,有时间的时候,我都会看看自己以前写的博客,也许是以前刚刚写博客,经验不足,感觉写出来的博客质量很不 ...

  2. Python编程中 re正则表达式模块 介绍与使用教程

    Python编程中 re正则表达式模块 介绍与使用教程 一.前言: 这篇文章是因为昨天写了一篇 shell script 的文章,在文章中俺大量调用多媒体素材与网址引用.这样就会有一个问题就是:随着俺 ...

  3. redis 3.0 集群__监控警报工具(sentinel)

    参考文档 http://redis.readthedocs.org/en/latest/topic/sentinel.html 因为目前还处于开发阶段,就先不研究了,待续

  4. 集成 jpush-react-native 常见问题汇总 (iOS 篇)

    给 iOS 应用添加推送功能是一件比较麻烦的事情,本篇文章收集了集成 jpush-react-native 的常见问题,目的是为了帮助用户更好地排查问题 1. 收不到推送 确保是在真机上测试,而不是在 ...

  5. CF666E Forensic Examination SAM+线段树合并+前缀树倍增

    $ \color{#0066ff}{ 题目描述 }$ 给你一个串\(S\)以及一个字符串数组\(T[1..m]\),\(q\)次询问,每次问\(S\)的子串\(S[p_l..p_r]\)在\(T[l. ...

  6. Codeforces - tag::data structures 大合集 [占坑 25 / 0x3f3f3f3f]

    371D 小盘子不断嵌套与大盘子,最后与地面相连,往里面灌水,溢出部分会往下面流,求每次操作时当前的盘子的容量 其实这道题是期末考前就做好了的.. 链式结构考虑并查集,然后没了(求大佬解释第一个T的点 ...

  7. python进程进阶

    本节目录: 1.进程的其他方法 2.验证进程之间是空间隔离的 3.守护进程 4.互斥锁 5.编写一个伪抢票程序 6.数据共享 7.for循环,join 8.队列 9.用队列完成一个生产者消费者模型 1 ...

  8. springcloud(一)-初识

    springCloud简介 尽管springCloud带有“cloud”字样,但它并不是云计算解决方案,而是在SpringBoot基础上构建的,用于快速构建分布式系统的通用的工具集.从技术架构上降低了 ...

  9. dp--hdu1171(01背包)

    hdu1171 题目 Problem Description Nowadays, we all know that Computer College is the biggest department ...

  10. MySQL授权命令grant的详细使用方法

    2019-01-07 转自 https://www.cnblogs.com/crxis/p/7044582.html 本文实例,运行于 MySQL 5.0 及以上版本. MySQL 赋予用户权限命令的 ...