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

/**
* @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. windows 本地搭建 apache+mysql+php环境详细讲解

    1.mysql下载配置 可参考这篇文章:https://www.cnblogs.com/myIvan/p/9265645.html 2.php下载及配置 可参考这篇文章:https://www.cnb ...

  2. Intellij idea maven 引用无法搜索远程仓库的解决方案

    打开项目的POM文件,ALT+Insert键 出来添加引用的窗口 说明无法搜索到远程仓库,需要怎么设置呢? 在intellij idea 中配置好maven后 是这样的 如果加载失败,则需要自定义远程 ...

  3. FPGA基础学习(8) --内部结构之存储单元

    目录 1. 基本结构 2. BRAM与DRAM的比较 3. BRAM的特点 4. Block Memory的使用 4.1 配置为RAM或ROM 4.2. 配置为FIFO 参考文献: 上一篇中提到了SL ...

  4. Python——爬取百度百科关键词1000个相关网页

    Python简单爬虫——爬取百度百科关键词1000个相关网页——标题和简介 网站爬虫由浅入深:慢慢来 分析: 链接的URL分析: 数据格式: 爬虫基本架构模型: 本爬虫架构: 源代码: # codin ...

  5. C语言实现数组逆置

    #include <stdio.h> #include <assert.h> void swap(int *a ,int *b) { int tmp = *a; *a = *b ...

  6. Oracle知识转储

    https://blog.csdn.net/u011479200/article/details/53086411 https://www.cnblogs.com/LiYi-Dao/p/9406189 ...

  7. J15W-J45W全铜质截止阀厂家,J15W-J45W全铜质截止阀价格 - 专题栏目 - 无极资讯网

    无极资讯网 首页 最新资讯 最新图集 最新标签   搜索 J15W-J45W全铜质截止阀 无极资讯网精心为您挑选了(J15W-J45W全铜质截止阀)信息,其中包含了(J15W-J45W全铜质截止阀)厂 ...

  8. proxy的作用

    get() get方法用于拦截某个属性的读取操作,可以接受三个参数,依次为目标对象.属性名和 proxy 实例本身(严格地说,是操作行为所针对的对象),其中最后一个参数可选. get方法的用法,上文已 ...

  9. kafka producer自定义partitioner和consumer多线程

    为了更好的实现负载均衡和消息的顺序性,Kafka Producer可以通过分发策略发送给指定的Partition.Kafka Java客户端有默认的Partitioner,平均的向目标topic的各个 ...

  10. greenplum表的distributed key值查看

    greenplum属于分布式的数据库,MPP+Share nothing的体系,查询的效率很快.不过,这是建立在数据分散均匀的基础上的.如果DK值设置不合理的话,完全有可能出现所有数据落在单个节点上的 ...