日期工具类处理总结(全)

简介: 日期工具类处理总结(全)


前言

最近项目中用到了一些关于日期类和字符串类的处理,用到一次就得去写一次,后来想了想这样不光效率低还浪费时间浪费精力,于是就将常用的一些方法提取成工具类,每个项目都考进去一次,用的时候直接调用即可。

下面我来分享一下我自己整理的一些工具方法:

代码展示

👉将时间戳转换成具体的年月日时分秒

在和安卓端交互时,处理时间的时候,一般都是以时间戳的方式进行互相传输,但是在PC端的时候,往往直接处理日期类型的数据比较方便,数据库中也是存的datetime格式的数据,于是我就写了个将时间戳转换成具体的时间,代码如下:

/**
   * 将毫秒转换成时间
   */
  /**
   * 根据时间戳获取时间
   */
  public static String getTimeChuo(Long time) {
    SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    //将时间戳转换为时间
    Date date = new Date(time);
    return format.format(date);
  }

🤞输入:1657335494926

✌输出:2022-07-09 10:58:14

👉计算两个日期之间相差的天数

有时候我们有这样的场景,需要知道一下开始日期和结束日期之间相差多少天,多少小时,多少分等,于是我就写了个计算两个日期之间相差的详细时间,代码如下:

/**
   * @param stratTime
   * @param endTime
   * @return 计算两个日期之间相差的天数
   */
  public static Map<String, Object> dateDiff(Long stratTime, Long endTime) {
    Map<String, Object> map = new HashMap<>();
    Long diff = endTime - stratTime;
    Long day = diff / (24 * 60 * 60 * 1000);
    Long hour = (diff / (60 * 60 * 1000) - day * 24);
    Long min = ((diff / (60 * 1000)) - day * 24 * 60 - hour * 60);
    Long sec = (diff / 1000 - day * 24 * 60 * 60 - hour * 60 * 60 - min * 60);
    map.put("day", day);
    map.put("hour", hour);
    map.put("min", min);
    map.put("sec", sec);
    return map;
  }

🤞输入:1656151439784L,1657335494926L

✌输出:{sec=15, min=54, hour=16, day=13},是一个Map结合

👉获取当前24小时的时间前后时间戳

比如现在是:2022年7月9日11:14:22,有些业务场景下,我们需要获取当前时间的前后24的时间,也就是昨天的这个时间和明天的这个时间,于是我就写了个工具方法,代码如下:

/**
   * 获取当前24小时的时间前后时间戳
   */
  public static Map<String, Object> getTimeChuo() {
    Map<String, Object> map = new HashMap<>();
    Long nowTime = System.currentTimeMillis();
    Long startTime = nowTime - 24 * 60 * 60 * 1000;
    Long endTime = nowTime + 24 * 60 * 60 * 1000;
    map.put("startTime", startTime);
    map.put("endTime", endTime);
    return map;
  }

🤞输入:无需参数

✌输出:{startTime=1657250129070, endTime=1657422929070},转化成日期就是:2022年7月8日11:14:22和2022年7月10日11:14:22

👉根据出生日期获得年龄

系统中的年龄你能直接写死吗,倒也可以,但是你明年得手动的再给人家加1岁。。。后年再加一岁。。。。。这不是个完全之策,于是我就写了个根据出生日期计算年龄的工具方法,代码如下:

public static int getAge(Date birthDay) throws Exception {
    Calendar cal = Calendar.getInstance();
    if (cal.before(birthDay)) {
      throw new IllegalArgumentException("出生日期小于当前时间,无效的日期!");
    }
    int yearNow = cal.get(Calendar.YEAR);
    int monthNow = cal.get(Calendar.MONTH);
    int dayOfMonthNow = cal.get(Calendar.DAY_OF_MONTH);
    cal.setTime(birthDay);
    int yearBirth = cal.get(Calendar.YEAR);
    int monthBirth = cal.get(Calendar.MONTH);
    int dayOfMonthBirth = cal.get(Calendar.DAY_OF_MONTH);
    int age = yearNow - yearBirth;
    if (monthNow <= monthBirth) {
      if (monthNow == monthBirth) {
        if (dayOfMonthNow < dayOfMonthBirth) age--;
      } else {
        age--;
      }
    }
    return age;
  }

🤞输入:new SimpleDateFormat("yyyy-MM-dd").parse("1998-09-08")

✌输出:23

👉统计两个日期之间的所有日期

比如有这样的场景,给某个人制定了个训练计划,这个计划从7月1日到7月7日,一周的减肥增肌方案。数据库存的话,只存了开始时间7月1日和结束时间7月7日。但是有个问题,你说这个人在7月5日有没有训练计划,7月6日有没有?当然有,于是我就写了个工具方法,代码如下:

/**
   * 统计两个日期之间的所有日期
   */
  public static List<String> getBeginTimeAndEndTime(Date beginTime, Date endTime) {
    List<String> listDate = new ArrayList<>();
    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
    try {
      Calendar calendar = Calendar.getInstance();
      calendar.setTime(beginTime);
      while (calendar.getTime().before(endTime) || calendar.getTime().equals(endTime)) {
        listDate.add(dateFormat.format(calendar.getTime()));
        calendar.add(Calendar.DAY_OF_MONTH, 1);
      }
      return listDate;
    } catch (Exception e) {
      e.printStackTrace();
    }
    return listDate;
  }

🤞输入:new SimpleDateFormat("yyyy-MM-dd").parse("2022-7-1"),new SimpleDateFormat("yyyy-MM-dd").parse("2022-7-8")

✌输出:

2022-07-01

2022-07-02

2022-07-03

2022-07-04

2022-07-05

2022-07-06

2022-07-07

2022-07-08

👉格式化日期:00:00点开始到23:59

将某个日期格式化成0时0分到23时59分,于是我就写了个工具方法,代码如下:

/**
   * 格式化日期:00:00点开始到23:59
   */
  public static List<Date> formatDayDateStratToEnd(String date){
    List<Date> dateList  = new ArrayList<Date>();
    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    Calendar c = Calendar.getInstance();
    try {
      c.setTime(simpleDateFormat.parse(date+" 00:00:00"));
    } catch (ParseException e) {
      e.printStackTrace();
    }
    if(date!=null){
      c.set(Calendar.HOUR_OF_DAY, 0);
      c.set(Calendar.MINUTE, 0);
      c.set(Calendar.SECOND, 0);
      c.set(Calendar.MILLISECOND, 0);
      dateList.add(c.getTime());
      c.set(Calendar.HOUR_OF_DAY, 23);
      c.set(Calendar.MINUTE, 59);
      c.set(Calendar.SECOND, 59);
      c.set(Calendar.MILLISECOND, 0);
      dateList.add(c.getTime());
    }
    return dateList;
  }

🤞输入:2022-07-01

✌输出:

Fri Jul 01 00:00:00 CST 2022

Fri Jul 01 23:59:59 CST 2022

当然这个日期你也可以自己格式化一下,格式化成需要的格式。

👉获取年月日,并且拼接起来 分隔符

某些情况下,我们的接口有这样的功能,根据指定的年月日查询信息,如果前台没有传年月日,那么我们就获取当前年与日进行查询,于是我就写了个工具方法,代码如下:

/**
   * 获取年月日,并且拼接起来  分隔符
   */
  public static String getDateYearAndMonthAndDay(String year,String month,String day,String separator) {
    //分隔符如果是空的话,则是-
    separator = Strings.isBlank(separator) ? "-" : separator;
    //如果年月日不传的话,获取当前的年月日
    StringBuilder currDate = new StringBuilder();
    Calendar date = Calendar.getInstance();
    year = Strings.isBlank(year) ? date.get(Calendar.YEAR) + "" : year;
    month = Strings.isBlank(month) ? date.get(Calendar.MONTH) + 1 + "" : month;
    day = Strings.isBlank(day) ? date.get(Calendar.DAY_OF_MONTH) + "" : day;
    int m = Integer.parseInt(month);
    int d = Integer.parseInt(day);
    month = m < 10 ? "0" + m : m + "";
    day = d < 10 ? "0" + d : d + "";
    currDate.append(year).append(separator).append(month).append(separator).append(day);
    return currDate.toString();
  }

🤞输入:null,null,null,null

✌输出:2022-07-09

或者:“2022”,null,null,“/”

✌输出:2022/07/09

最后一个参数是年月日之间的分隔符,前面的三个参数分别是年月日,可以选择性的传递

相关文章
|
6月前
|
Java API Maven
精雕细琢的文档体验:Spring Boot 与 Knife4j 完美交汇
本文将深入探讨在 Spring Boot 项目中整合 Knife4j,这是一种基于 Swagger 的文档工具。通过使用 Knife4j,你可以轻松生成清晰、美观的 API 文档,提升你的项目文档管理水平。文章从基础概念到高级特性,带你领略 Knife4j 的独特魅力。
890 5
|
Java jvm-sandbox Perl
Jvm-Sandbox源码分析--启动简析
1.工作原因,使用jvm-sandbox比较多,遂进行源码分析,做到知己知彼,个人能力有限,如有错误,欢迎指正。 2.关于jvm-sandbox 是什么,如何安装相关环境,可移步官方文档 3.源码分析基于jvm-sandbox 最新的master代码,tag-1.2.1。
8000 0
Jvm-Sandbox源码分析--启动简析
9hutool实战:LocalDateTimeUtil(JDK8+中的LocalDateTime 工具类封装)
9hutool实战:LocalDateTimeUtil(JDK8+中的LocalDateTime 工具类封装)
728 0
9hutool实战:LocalDateTimeUtil(JDK8+中的LocalDateTime 工具类封装)
|
6月前
|
监控 Java 测试技术
Spring Boot与事务钩子函数:概念与实战
【4月更文挑战第29天】在复杂的业务逻辑中,事务管理是确保数据一致性和完整性的关键。Spring Boot提供了强大的事务管理机制,其中事务钩子函数(Transaction Hooks)允许开发者在事务的不同阶段插入自定义逻辑。本篇博客将详细探讨事务钩子函数的概念及其在Spring Boot中的应用。
172 1
|
6月前
|
负载均衡 数据库连接 API
什么是HTTP 500错误,怎么解决
什么是HTTP 500错误,怎么解决
4829 0
|
6月前
|
存储 Java
|
XML SQL Java
Spring 中声明式事务和编程式事务的使用
Spring 中声明式事务和编程式事务的使用
153 0
|
6月前
|
测试技术 应用服务中间件 数据库
什么是稳定性测试?
什么是稳定性测试?
1183 0
|
6月前
|
Java API 数据库
SpringBoot - 优雅的处理【长事务】
SpringBoot - 优雅的处理【长事务】
171 0
|
6月前
|
JSON Java 数据库
在Spring Boot开发中使用DTO层
在Spring Boot开发中使用DTO层
344 0