java时间与现在做比较展示对应格式描述信息【刚刚,几分钟,几小时前,几天前,xx年xx月xx日】

2023-05-16

文章目录

    • 视频讲解
    • 实现效果
    • 简述
    • 实现思路
    • 完整代码

视频讲解

哔哩哔哩视频讲解

实现效果

在这里插入图片描述

简述

今天遇到一个需求,就是将消息的创建时间与当前时间做比较,展示对应的数据格式,具体要求如下:

1. 1分钟内:刚刚              
2. 60分钟内:x分钟前           
3. 24小时内:x小时前           
4. >24小时:x月x日  08-1     
5. 非年内:年--2021-05-02 

实现思路

从需求描述来看,我们很容易可以发现需要比较的时间的最小精度是【秒】,所以我们具体操作可以这样做

  1. 先取得年份,比较是否在年内
  2. 当前时间与传入时间比较取得秒数差
  3. 比较60秒内显示刚刚
  4. 秒数差 < 60*60 (即60分钟) => 秒数差/60 分钟前
  5. 秒数差 < 606024 (即24小时内) => 秒数差/60*60 小时前
  6. 秒数差 >606024 (即24小时内) => 转localDateTime 后再格式化输出 【SimpleDateFormat多线程不安全】

转换成代码如下:
在这里插入图片描述

为了操作方便,也避免计算出错,这里将各个时间单位转换为秒数定义为静态常量,并且使用DateTimFormatter格式化保证多线程安全,如下:
在这里插入图片描述

完整代码

封装DateUtil工具类

import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.Date;

/**
 * @Author: lzp
 * @description:
 * @Date: 2022/8/6
 */
public class DateUtils {

    /**
     * 一天、一分钟、一小时对应的秒数
     */
    private static final Long ONE_MINUTE_TO_SECOND = 60L;
    private static final Long ONE_HOUR_TO_SECOND = ONE_MINUTE_TO_SECOND * 60;
    private static final Long ONE_DAY_TO_SECOND = ONE_HOUR_TO_SECOND * 24;

    /**
     * 使用LocalDateTime进行格式化 保证多线程安全
     */
    private static final DateTimeFormatter DATE_TIME_FORMATTER1 = DateTimeFormatter.ofPattern("yyyy-MM-dd");
    private static final DateTimeFormatter DATE_TIME_FORMATTER2 = DateTimeFormatter.ofPattern("MM-dd");

    /**
     * 设置推送消息的时间描述
     * 1. 1分钟内:刚刚
     * 2. 60分钟内:x分钟前
     * 3. 24小时内:x小时前
     * 4. >24小时:x月x日  08-1
     * 5. 非年内:年-月-日 2021-05-02
     *
     * @param now        当前时间  传一个当前时间目的是方便遍历,减少date对象的创建
     * @param targetDate 与当前时间做对比的时间
     */
    public static String getTimeDescriptionByDate(Date now, Date targetDate) {
        String timeDescription = "";
        if (targetDate != null) {
            // 5. 年内判断
            if (targetDate.getYear() == now.getYear()) {
                // 获取秒数差
                long betweenSeconds = (now.getTime() - targetDate.getTime()) / 1000;
                if (betweenSeconds < ONE_MINUTE_TO_SECOND) {
                    // 1. 1分钟内:刚刚
                    timeDescription = "刚刚";
                } else if (betweenSeconds < ONE_HOUR_TO_SECOND) {
                    // 2. 60分钟内
                    timeDescription = betweenSeconds / ONE_MINUTE_TO_SECOND + "分钟前";
                } else if (betweenSeconds < ONE_HOUR_TO_SECOND * 24) {
                    // 3. 24小时内:x小时前
                    timeDescription = betweenSeconds / ONE_HOUR_TO_SECOND + "小时前";
                } else {
                    // 4. >24小时:x月x日  08-1
                    timeDescription = dateToLocalDateTime(targetDate).format(DATE_TIME_FORMATTER2);
                }
            } else {
                timeDescription = dateToLocalDateTime(targetDate).format(DATE_TIME_FORMATTER1);
            }
        }
        return timeDescription;
    }

    /**
     * date转localDateTime
     */
    public static LocalDateTime dateToLocalDateTime(Date date) {
        return date.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
    }

}

测试类,直接运行即可,能够自动按照当前时间显示对应的描述:

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * @Author: lzp
 * @description:
 * @Date: 2022/8/6
 */
public class Demo {
    public static void main(String[] args) throws ParseException {
        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date now = new Date();
        Calendar cal = Calendar.getInstance();
        cal.setTime(now);
        System.out.printf("当前时间为:%s ==============================\n", df.format(now));
        cal.add(Calendar.SECOND, -20); // 20秒前
        System.out.printf("%s => %s\n", df.format(cal.getTime()), DateUtils.getTimeDescriptionByDate(now, cal.getTime()));
        cal.add(Calendar.MINUTE, -1); // 1分钟前
        System.out.printf("%s => %s\n", df.format(cal.getTime()), DateUtils.getTimeDescriptionByDate(now, cal.getTime()));
        cal.add(Calendar.HOUR, -1); // 1小时前
        System.out.printf("%s => %s\n", df.format(cal.getTime()), DateUtils.getTimeDescriptionByDate(now, cal.getTime()));
        cal.add(Calendar.DAY_OF_MONTH, -1); // 1天前
        System.out.printf("%s => %s\n", df.format(cal.getTime()), DateUtils.getTimeDescriptionByDate(now, cal.getTime()));
        cal.add(Calendar.YEAR, -1); // 1年前
        System.out.printf("%s => %s\n", df.format(cal.getTime()), DateUtils.getTimeDescriptionByDate(now, cal.getTime()));
    }
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java时间与现在做比较展示对应格式描述信息【刚刚,几分钟,几小时前,几天前,xx年xx月xx日】 的相关文章

  • IDEA背景图片设置——提升编码情调

    1 打开设置页面 xff08 Ctrl 43 Alt 43 S xff0c 选择keymap xff0c 右侧界面输入框中输入 Set Background Image xff0c 然后双击下方的 Set Background Image
  • Android Studio如何实现音乐播放器(简单易上手)

    我们大家平时长时间打代码的时候肯定会感到疲惫和乏味 xff0c 这个时候一边播放自己喜欢的音乐 xff0c 一边继续打代码 xff0c 心情自然也愉快很多 音乐带给人的听觉享受是无可比拟的 xff0c 动听的音乐可以愉悦人的身心 xff0c
  • 一分钟学会Python中pip的安装与使用

    文章目录 一 简单介绍二 下载安装三 最常用命令1 显示版本和路径2 获取帮助3 升级 pip4 安装包5 升级包6 卸载包7 搜索包8 显示安装包信息9 列出已安装的包10 查看指定包的详细信息 一 简单介绍 pip 是 Python 包
  • 史上最全的Android基础教程+实战练习+经验技巧(建议收藏)|寻找C站宝藏

    博主一年前发布了一些Android项目和教程 xff0c 当时就是想分享给大家 xff0c 帮助大家解决遇到的难题 xff0c 少走弯路 经常看到评论下有同学说博主很细心 讲的很详细 xff0c 还有很良心免费分享源码 xff0c 博主很欣
  • Android Studio实现音乐播放器2.0

    项目目录 一 引言二 项目概述1 需求分析2 设计分析3 资源文件分析 三 开发环境四 优化设计 x1f337 1 上一首下一首 x1f33e 2 控件UI优化 x1f341 3 登录和注册 x1f334 4 数据库设计 x1f33b 5
  • Android Studio实现功能强大的购物商城APP

    这里写目录标题 一 项目概述二 开发环境三 项目结构四 配置服务器五 项目演示五 项目总结六 源码获取 一 项目概述 本次项目是现在软件商店很流行的购物商城APP xff0c 现在万物互联的时代 xff0c 网上shopping早已经是大家
  • 教你彻底卸载Ubuntu双系统,去污不残留

    我们卸载Ubuntu双系统 xff0c 可能出于以下原因 xff1a span class token number 1 span span class token class name Ubuntu span 系统内核损坏无法正常进入 s
  • Could not initialize class org.codehaus.groovy.vmplugin.v7.Java7

    Android Studio 2022 2 1同步时出现的报错 xff0c 原因是使用了AS自带的jdk17 xff0c 我们换成自己电脑上安装的jdk1 8即可 xff0c 没有安装的同学看JDK安装教程 1 首先File gt Sett
  • Android Studio实现文艺阅读App

    项目目录 一 系统概述二 系统特点三 开发环境四 运行演示五 源码获取 一 系统概述 本次带来的文艺阅读App可以提供高质量的原创文学作品 用户可以App中找到各种类型的文学作品 xff0c 包括小说 散文 诗歌等 xff0c 由来自不同领
  • Failed to install the following Android SDK packages as some licences have not been accepted. bu

    报错信息 Android 开发者工具 Android开发者构建工具28 0 3 Android开发者平台28的协议都没有被接受 Failed to install the following Android SDK packages as
  • Qt如何使QTreeWidget始终保持展开?

    文章已更新 xff0c 最新地址 xff1a http www fearlazy com index php post 122 html 有时候我们在使用树形控件实现项目分组功能时 xff0c 不希望点击组名 即顶层Item 时收缩 此时应
  • Received status code 400 from server: Bad Request

    一 报错信息 FAILURE span class token operator span span class token class name Build span failed span class token keyword wit
  • wangEditor使用教程

    1 安装 xff08 vue2 xff09 yarn add 64 wangeditor editor 或者 npm install 64 wangeditor editor save yarn add 64 wangeditor edit
  • 微信小程序之问卷调查

    登录界面 login js span class token comment miniprogram pages login login js span span class token function Page span span cl
  • NISP

    文章目录 NISP七月份练习01NISP七月份练习02NISP七月份练习03NISP七月份练习04NISP七月份练习05NISP七月份练习06NISP七月份练习07NISP七月份练习08NISP七月份练习09NISP七月份练习10NISP七
  • Redis系列漏洞总结

    Redis系列漏洞总结 文章目录 Redis系列漏洞总结环境 ubuntu16 04 redis5 0 1 redis下载及安装redis 漏洞利用方式0x01 绝对路径写shell0x02 redis 写入ssh公钥0x03 Redis主
  • 国密浏览器介绍与下载

    国密浏览器介绍与下载 密信浏览器介绍支持操作系统下载地址 奇安信可信浏览器 xff08 国密开发者专版 xff09 介绍支持操作系统下载地址 红莲花安全浏览器介绍支持操作系统下载地址 零信浏览器介绍支持操作系统下载地址 360安全浏览器介绍
  • linux/php一句话图片马及实例

    Ubuntu一句话图片马 准备一张图片tu jpeg phpinfo php和hack php xff1b Phpinfo php文件内容 xff1a hack php文件内容 xff1a 准备一个16进制软件UE UltraEdit li
  • 黑客网络安全扫描工具

    黑客网络安全扫描工具 项目简介1 子域名枚举扫描器或爆破工具2 数据库类漏洞扫描器或爆破工具3 弱口令 弱用户名扫描器或爆破工具4 物联网设备识别工具或扫描器5 反射型或DOM Based XSS扫描器6 企业资产管理或信息泄露搜集工具7
  • MSF之ms17-010永恒之蓝漏洞利用

    MSF之ms17 010永恒之蓝漏洞利用 准备扫描漏洞漏洞攻击 准备 实验准备环境 xff1a 被攻击机 xff1a 虚拟机win7x64位系统 其IP为 xff1a 10 101 2 11 xff08 关闭了防火墙 xff09 攻击机 x

随机推荐