Java实用的DateUtils时间工具类介绍

简介: 判断两个时间段是否重叠、上个月的最后一天、构造一个时间段、将单元格数据转换为日期样式的字符串、将单元格数据转换为日期样式的字符串、计算字符型日期天数差

/**
* 日期工具类
* <p>
*   使用LocalDateTime存取或判断
* </p>
*/
@Component
public class DateUtils {


 /**
  * 判断两个时间段是否重叠
  * @param slot1
  * @param slot2
  * @return
  */
 public static boolean overlapped(TimeSlot slot1, TimeSlot slot2) {

   TimeSlot previous, next;

   previous = slot1.startTime.isBefore(slot2.startTime) ? slot1 : slot2;

   next = slot2.startTime.isAfter(slot1.startTime) ? slot2 : slot1;

   // 这里业务需要,允许时间点的重叠
   // 例如某个时间段的起始时间:2020-06-29 00:00:00
   // 和另一个时间段的终止时间:2020-06-29 00:00:00
   // 它们俩可以有交点。如果不需要这种逻辑只把le改成lt
   // ge改成gt就可
   return !(lt(previous, next) || gt(previous, next));

 }


 /**
  * 上个月的最后一天
  */
 public static String afterMonthLastDay() {

   Calendar c = Calendar.getInstance();

   //当前日期设置为指定日期
   c.setTime(new Date());

   //指定日期月份减去一
   c.add(Calendar.MONTH, -1);

   //指定日期月份减去一后的 最大天数
   c.set(Calendar.DATE, c.getActualMaximum(Calendar.DATE));

   //获取上给月最后一天的日期
   Date lastDateOfPrevMonth = c.getTime();

   java.text.DateFormat formater = new SimpleDateFormat("yyyy-MM-dd");

   return formater.format(lastDateOfPrevMonth);

 }


 /**
  * 构造一个时间段
  * @param startTime
  * @param endTime
  * @return
  */
 public static TimeSlot buildSlot(LocalDateTime startTime, LocalDateTime endTime) {

   return new TimeSlot(startTime, endTime);

 }


 /**
  * less equal
  * 小于等于
  * @param prev
  * @param next
  * @return
  */
 private static boolean le(TimeSlot prev, TimeSlot next) {

   return lt(prev, next) || next.endTime.isEqual(prev.startTime);

 }


 /**
  * greater equal
  * 大于等于
  * @param prev
  * @param next
  * @return
  */
 private static boolean ge(TimeSlot prev, TimeSlot next) {

   return gt(prev, next) || prev.endTime.isEqual(next.startTime);

 }


 /**
  * greater than
  * 大于
  * @param prev
  * @param next
  * @return
  */
 private static boolean gt(TimeSlot prev, TimeSlot next) {

   return prev.endTime.isBefore(next.startTime);

 }


 /**
  * less than
  * 小于
  * @param prev
  * @param next
  * @return
  */
 private static boolean lt(TimeSlot prev, TimeSlot next) {

   return next.endTime.isBefore(prev.startTime);

 }



 /**
  * 将单元格数据转换为日期样式的字符串
  *
  * @param cell
  * @return
  */
 public static String convertDate(Cell cell) {

   String value = "";

   if (cell.getCellType() == CellType.NUMERIC) {

     if (HSSFDateUtil.isCellDateFormatted(cell)) {

       //用于转化为日期格式
       Date d = cell.getDateCellValue();

       java.text.DateFormat formater = new SimpleDateFormat("yyyy-MM-dd");

       value = formater.format(d);

     }

   }

   return value;

 }


 /**
  * 将单元格数据转换为日期样式的字符串
  *
  * @param cell
  * @return
  */
 public static String convertString(Cell cell) {

   String value = "";

   if (cell.getCellType() == CellType.STRING) {

     value = cell.getStringCellValue();

   }

   return value;

 }


 /**
  * 将单元格数据转换为金额样式的字符串
  * @author:xhmaca
  * @param cell
  * @return
  */
 public static String convertBigDecimal(Cell cell) {

   String value = "";

   if (cell.getCellType() == CellType.NUMERIC) {

     if (HSSFDateUtil.isCellDateFormatted(cell)) {


     } else {

       BigDecimal bigDecimal = new BigDecimal(cell.getNumericCellValue());

       value = bigDecimal.toString();

     }

   }

   return value;

 }


 /**
  * 计算字符型日期天数差
  * @param dateStart
  * @param dateStop
  */
 public static Integer dateDifferent(String dateStart, String dateStop) {

   long diff,diffSeconds,diffMinutes,diffHours,diffDays = 0;

   SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");

   try {

     Date d1 = format.parse(dateStart);//毫秒ms
     Date d2 = format.parse(dateStop);//毫秒ms
     diff = d2.getTime() - d1.getTime();

     diffSeconds = diff / 1000 % 60;

     diffMinutes = diff / (60 * 1000) % 60;

     diffHours = diff / (60 * 60 * 1000) % 24;

     diffDays = diff / (24 * 60 * 60 * 1000);

     System.out.print("两个时间相差:");

     System.out.print(diffDays + ",");

     System.out.print(diffHours + "小时,");

     System.out.print(diffMinutes + "分钟,");

     System.out.print(diffSeconds + ".");

   } catch (ParseException e) {

     e.printStackTrace();

   }

   int days = (int) diffDays;

   return days;

 }


 /**
  * 计算字符型日期天数差
  * @param dateStart
  * @param dateStop
  */
 public static long datelongDifferent(String dateStart, String dateStop) {

   long diff,diffSeconds,diffMinutes,diffHours,diffDays = 0;

   SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");

   try {

     Date d1 = format.parse(dateStart);//毫秒ms
     Date d2 = format.parse(dateStop);//毫秒ms
     diff = d2.getTime() - d1.getTime();

     diffSeconds = diff / 1000 % 60;

     diffMinutes = diff / (60 * 1000) % 60;

     diffHours = diff / (60 * 60 * 1000) % 24;

     diffDays = diff / (24 * 60 * 60 * 1000);

     System.out.print("两个时间相差:");

     System.out.print(diffDays + ",");

     System.out.print(diffHours + "小时,");

     System.out.print(diffMinutes + "分钟,");

     System.out.print(diffSeconds + ".");

   } catch (ParseException e) {

     e.printStackTrace();

   }

   return diffDays;

 }


 /**
  * 获取当前日期
  */
 public static String getCurrectDate()

 {

   SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");

   Date date = new Date();//当前日期
   return df.format(date);

 }


 /**
  * 获取当前日期
  */
 public static String getLongFormatDate(String date)

 {

   SimpleDateFormat df1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

   return df1.format(date);

 }


 /**
  * 获取当前日期
  */
 public static String getShortFormatDate(String date)

 {

   SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");

   return df.format(date);

 }


 /**
  * 计算年份
  * @param dateStart
  *
  */
 public static Integer getYear(String dateStart) {

   long diff,diffSeconds,diffMinutes,diffHours,diffDays = 0;

   SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");

   try {

     Date d1 = format.parse(dateStart);//毫秒ms
     return d1.getYear()+1900;


   } catch (ParseException e) {

     e.printStackTrace();

   }

   return 0;

 }


 /**
  * 时间段类
  */
 static class TimeSlot{

   private LocalDateTime startTime;

   private LocalDateTime endTime;


   public TimeSlot(LocalDateTime startTime, LocalDateTime endTime) {

     if (startTime.isAfter(endTime)) {

       this.startTime = endTime;

       this.endTime = startTime;

     } else {

       this.startTime = startTime;

       this.endTime = endTime;

     }

   }


 }

}

相关文章
|
1月前
|
算法 搜索推荐 Java
java 后端 使用 Graphics2D 制作海报,画echarts图,带工具类,各种细节:如头像切割成圆形,文字换行算法(完美实验success),解决画上文字、图片后不清晰问题
这篇文章介绍了如何使用Java后端技术,结合Graphics2D和Echarts等工具,生成包含个性化信息和图表的海报,并提供了详细的代码实现和GitHub项目链接。
110 0
java 后端 使用 Graphics2D 制作海报,画echarts图,带工具类,各种细节:如头像切割成圆形,文字换行算法(完美实验success),解决画上文字、图片后不清晰问题
|
1月前
|
Java
Java 些许公共工具类
Java 些许公共工具类
15 1
|
3月前
|
缓存 前端开发 Java
【前端学java】java基础巩固复习巩固语法练习-工具类的封装(14)
【8月更文挑战第10天】java基础巩固,工具类的封装
27 1
【前端学java】java基础巩固复习巩固语法练习-工具类的封装(14)
|
3月前
|
Java
Java应用结构规范问题之在UnitConvertUtils工具类将千米转换为米的问题如何解决
Java应用结构规范问题之在UnitConvertUtils工具类将千米转换为米的问题如何解决
|
3月前
|
存储 设计模式 安全
Java GenericObjectPool 对象池化技术--SpringBoot sftp 连接池工具类
Java GenericObjectPool 对象池化技术--SpringBoot sftp 连接池工具类
61 0
|
4月前
|
设计模式 存储 安全
Java面试题:设计一个线程安全的单例类并解释其内存占用情况?使用Java多线程工具类实现一个高效的线程池,并解释其背后的原理。结合观察者模式与Java并发框架,设计一个可扩展的事件处理系统
Java面试题:设计一个线程安全的单例类并解释其内存占用情况?使用Java多线程工具类实现一个高效的线程池,并解释其背后的原理。结合观察者模式与Java并发框架,设计一个可扩展的事件处理系统
62 1
|
4月前
|
设计模式 缓存 安全
Java面试题:设计模式在并发编程中的创新应用,Java内存管理与多线程工具类的综合应用,Java并发工具包与并发框架的创新应用
Java面试题:设计模式在并发编程中的创新应用,Java内存管理与多线程工具类的综合应用,Java并发工具包与并发框架的创新应用
42 0
|
4月前
|
设计模式 存储 缓存
Java面试题:结合建造者模式与内存优化,设计一个可扩展的高性能对象创建框架?利用多线程工具类与并发框架,实现一个高并发的分布式任务调度系统?设计一个高性能的实时事件通知系统
Java面试题:结合建造者模式与内存优化,设计一个可扩展的高性能对象创建框架?利用多线程工具类与并发框架,实现一个高并发的分布式任务调度系统?设计一个高性能的实时事件通知系统
58 0
|
4月前
|
设计模式 并行计算 安全
Java面试题:如何使用设计模式优化多线程环境下的资源管理?Java内存模型与并发工具类的协同工作,描述ForkJoinPool的工作机制,并解释其在并行计算中的优势。如何根据任务特性调整线程池参数
Java面试题:如何使用设计模式优化多线程环境下的资源管理?Java内存模型与并发工具类的协同工作,描述ForkJoinPool的工作机制,并解释其在并行计算中的优势。如何根据任务特性调整线程池参数
51 0
|
4月前
|
设计模式 安全 NoSQL
Java面试题:结合单例模式与Java内存管理,设计一个线程安全的单例类?分析Java多线程工具类ExecutorService与Java并发工具包中的工具类,设计一个Java并发框架的分布式锁实现
Java面试题:结合单例模式与Java内存管理,设计一个线程安全的单例类?分析Java多线程工具类ExecutorService与Java并发工具包中的工具类,设计一个Java并发框架的分布式锁实现
64 0
下一篇
无影云桌面