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

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


前言

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

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

代码展示

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

在和安卓端交互时,处理时间的时候,一般都是以时间戳的方式进行互相传输,但是在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

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

目录
相关文章
|
10月前
|
监控 IDE Java
XXL-JOB任务调度详解
XXL-JOB任务调度详解
266 0
|
4天前
|
SQL 容灾 关系型数据库
[版本更新] PolarDB-X V2.4 列存引擎开源正式发布
[版本更新] PolarDB-X V2.4 列存引擎开源正式发布!
[版本更新] PolarDB-X V2.4 列存引擎开源正式发布
|
4天前
|
存储 关系型数据库 分布式数据库
数据管理的艺术:PolarDB开源版详评与实战部署策略(二)
PolarDB-PG是阿里云的一款云原生关系型数据库,100%兼容PostgreSQL,支持Oracle语法,采用Shared-Storage存储计算分离架构,提供极致弹性、毫秒级延迟的HTAP能力。具备高可用、高可靠和弹性扩展特性,支持单机、存储计算分离和X-Paxos三节点等多种部署形态。通过Docker可快速部署实例,包括单节点、一主一备和HTAP(一主两备)实例。此外,文章还介绍了在ECS上使用ESSD云盘搭建PolarDB-PG的详细步骤,适合开发和测试环境。
123001 12
|
4天前
|
运维 监控 Cloud Native
如何设计与构建 FinOps 流程、团队、体系与目标
企业 FinOps 实施不是一蹴而就的项目,如果您正在推进企业云原生 FinOps 落地,除了选择合适的技术手段,企业内部的流程和体系建设也尤为重要。
162304 12
|
4天前
|
分布式计算 Java API
Java8 Lambda实现源码解析
Java8的lambda应该大家都比较熟悉了,本文主要从源码层面探讨一下lambda的设计和实现。
162557 8
|
4天前
|
关系型数据库 Serverless 分布式数据库
PolarDB PostgreSQL版Serverless技术原理解读
数据库是现代企业IT系统中非常重要的一部分。在创建数据库时,客户往往需要比较保守地去配置数据库集群的资源,包括CPU、内存、存储以及连接数等多种参数配置,以确保业务能够在波峰和波谷都能平稳运行。在这种情况下,客户购买的集群资源在业务波谷时期会被闲置,导致整体成本偏高;而在业务压力增长阶段,集群资源又应对不足。Serverless数据库可以很好地解决这个问题。它能够让数据库集群资源随客户业务负载动态弹性扩缩,将客户从复杂的业务资源评估和运维工作中解放出来。 本文描述PolarDB PostgreSQL版Serverless的构建中, 如何实现弹得快、弹得准、弹得稳、弹得广的几个关键技术点。
75786 5
PolarDB PostgreSQL版Serverless技术原理解读
|
4天前
|
缓存 自然语言处理 JavaScript
万字长文深度解析JDK序列化原理及Fury高度兼容的极致性能实现
Fury是一个基于JIT动态编译的高性能多语言原生序列化框架,支持Java/Python/Golang/C++/JavaScript等语言,提供全自动的对象多语言/跨语言序列化能力,以及相比于别的框架最高20~200倍的性能。
168491 0
|
4天前
|
NoSQL MongoDB 数据库
探寻MongoDB副本集选举机制 阿里云与MongoDB的DBaaS技术合作创新
阿里云连续第五年斩获MongoDB合作伙伴奖项,也是唯一获此殊荣的中国云厂商。一起学习MongoDB副本集的选举机制以及可能会出现的特殊情况。
探寻MongoDB副本集选举机制  阿里云与MongoDB的DBaaS技术合作创新
|
4天前
|
SQL 大数据 BI
从离线到实时:无锡锡商银行基于 Apache Doris 的数据仓库演进实践
从离线到实时:无锡锡商银行基于 Apache Doris 的数据仓库演进实践
|
4天前
|
存储 关系型数据库 MySQL
数据管理的艺术:PolarDB开源版详评与实战部署策略(一)
PolarDB-X是阿里巴巴自研的高性能云原生分布式数据库,基于共享存储的Shared-nothing架构,支持MySQL生态,具备金融级高可用、分布式水平扩展、HTAP混合负载等能力。它通过CN(计算节点)和DN(存储节点)实现计算与存储分离,保证数据强一致性,并支持全局二级索引和多主多写。PolarDB-X开源版提供更高程度的定制化和控制权,适合追求技术自主性和成本优化的开发者。部署方式包括RPM包、PXD工具和Kubernetes,其中PXD工具提供了一键部署的便利性。
69434 14