需求背景

我的需求是获取当前时间之后的下一个“整5分钟时间点”。

首先,那么何为“整5分钟时间点”?

满足以下两个条件的时间:

  1. 分钟数等于以下时间中的一个,且秒数和毫秒数为 0:
[00, 05, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55]
  1. 获得的时间大于当前时间

然后,得到了这个“整5分钟时间点” ,我可以求得时间差:

时间差 = “整5分钟时间点” - 当前时间

最后,利用这个时间差可以用来

  • 设定 缓存 的过期时间

    例如 Redis 缓存
  • 设定 定时/延迟任务

    例如 ScheduledExecutorService.schedule

    例如 Timer.schedule

举例说明

例如给定时间为 2020-07-10 13:03:28 得到的“整5分钟时间”为 2020-07-10 13:05:00

实现方法

需要考虑 分钟值 为 55分钟以下55分钟及以上 两种情况,代码如下:

public class TimeHelper {
/**
* 获取下一个分钟值以0或者5结尾的时间点(单位:毫秒)
* @return
*/
public static long getNextMillisEndWithMinute0or5(Date baseTime) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(baseTime);
int minute = calendar.get(Calendar.MINUTE);
if (minute < 55) {
int add = minute%10 < 5? 5 - minute%10 : 10 - minute%10;
calendar.add(Calendar.MINUTE,add);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MILLISECOND, 0);
return calendar.getTime().getTime();
}
// 当前时间+1小时
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MILLISECOND, 0);
Date endTime = DateUtils.addHours(calendar.getTime(), 1);
return endTime.getTime();
}
}

测试用例

测试用例需要用到

import org.apache.commons.lang.time.DateFormatUtils;

需要考虑到跨小时、跨天、跨(闰)月、跨(闰)年的情况,用例代码如下:

public class TimeHelperTest {

    @Test
public void timeEndWithMinute0or5() throws ParseException {
final String format = "yyyy-MM-dd HH:mm:ss";
DateFormat dF = new SimpleDateFormat(format);
long next = TimeHelper.getNextMillisEndWithMinute0or5(new Date());
System.out.println(DateFormatUtils.format(next, format)); long test2 = TimeHelper.getNextMillisEndWithMinute0or5(dF.parse("2020-07-10 11:35:00"));
Assert.assertEquals("2020-07-10 11:40:00", DateFormatUtils.format(test2, "yyyy-MM-dd HH:mm:ss")); // 跨小时
long test3 = TimeHelper.getNextMillisEndWithMinute0or5(dF.parse("2020-07-10 12:59:59"));
Assert.assertEquals("2020-07-10 13:00:00", DateFormatUtils.format(test3, "yyyy-MM-dd HH:mm:ss")); // 跨天
long test4 = TimeHelper.getNextMillisEndWithMinute0or5(dF.parse("2020-07-10 23:59:59"));
Assert.assertEquals("2020-07-11 00:00:00", DateFormatUtils.format(test4, "yyyy-MM-dd HH:mm:ss")); // 跨闰月
long test5 = TimeHelper.getNextMillisEndWithMinute0or5(dF.parse("2020-02-29 23:55:59"));
Assert.assertEquals("2020-03-01 00:00:00", DateFormatUtils.format(test5, "yyyy-MM-dd HH:mm:ss")); // 跨闰年
long test6 = TimeHelper.getNextMillisEndWithMinute0or5(dF.parse("2019-12-31 23:55:59"));
Assert.assertEquals("2020-01-01 00:00:00", DateFormatUtils.format(test6, "yyyy-MM-dd HH:mm:ss"));
}
}

java计算下一个整5分钟时间点的更多相关文章

  1. c# 计算两日期的工作时间间隔(排除非工作日)及计算下一个工作时间点.

    一个日期段如工作时间为 8:00 至 17:00 public class TimeHelper { /// <summary> /// 计算时间间隔 /// </summary&g ...

  2. 다음에 적용될 Auto_increment 값 알아 내기 (计算下一个Auto_increment的值)

    Mysql 4.X <------ SHOW TABLE STATUS FROM [DB_NAME] LIKE '[TABLE_NAME]';     Mysql 5.X ----------- ...

  3. java 获取下一个字母(传大写返回大写,传小写返回小写)

    public static String getNextUpEn(String en){ char lastE = 'a'; char st = en.toCharArray()[0]; if(Cha ...

  4. Java 8 (11) 新的日期和时间API

    在Java 1.0中,对日期和时间的支持只能依赖java.util.Date类.这个类只能以毫秒的精度表示时间.这个类还有很多糟糕的问题,比如年份的起始选择是1900年,月份的起始从0开始.这意味着你 ...

  5. LeetCode 681. Next Closest Time 最近时刻 / LintCode 862. 下一个最近的时间 (C++/Java)

    题目: 给定一个"HH:MM"格式的时间,重复使用这些数字,返回下一个最近的时间.每个数字可以被重复使用任意次. 保证输入的时间都是有效的.例如,"01:34" ...

  6. 获取当前时间UTC时间的下一个15分钟时间点

    ZonedDateTime zdt = ZonedDateTime.now(ZoneOffset.UTC); int now15Minute = zdt.getMinute() / P15MINUTE ...

  7. [LeetCode] Next Closest Time 下一个最近时间点

    Given a time represented in the format "HH:MM", form the next closest time by reusing the ...

  8. [LeetCode] 681. Next Closest Time 下一个最近时间点

    Given a time represented in the format "HH:MM", form the next closest time by reusing the ...

  9. #python计算结果百位500向下取整,(0-499取000,500-999取500)

    !/usr/bin/env python coding:utf-8 计算结果百位500向下取整,(0-499取000,500-999取500) import math calc_Amount = fl ...

随机推荐

  1. SpringBoot -- 项目结构+启动流程

    一.简述: 项目结构 二.简述:启动流程 说springboot的启动流程,当然少不了springboot启动入口类 @SpringBootApplication public class Sprin ...

  2. 高性能IO —— Reactor(反应器)模式

    讲到高性能IO绕不开Reactor模式,它是大多数IO相关组件如Netty.Redis在使用的IO模式, 为什么需要这种模式,它是如何设计来解决高性能并发的呢? 最最原始的网络编程思路就是服务器用一个 ...

  3. Hibenate面试

    5. 对比总结 返回值: get()返回的是查询出来的实体对象,而load()查询出来的是一个目标实体的代理对象. 查询时机: get()在调用的时候就立即发出SQL语句查询,而load()在访问非I ...

  4. String类基础知识

    1.String类的构造方法 (1)String(String original)  //把字符串数据封装成字符串对象 (2)String(char[] c)   //把字符数组的数据封装成字符串对象 ...

  5. django 类视图的使用

    使用django框架也有挺长时间了,但是一直都没有用过django的类视图,因为之前跟着网上教程学习时,觉得类视图是进阶的知识,可能目前还达不到吧 但今天在做项目的时候用到了,感觉真的太方便了吧,而且 ...

  6. Netty源码学习系列之5-NioEventLoop的run方法

    前言     NioEventLoop的run方法,是netty中最核心的方法,没有之一.在该方法中,完成了对已注册的channel上来自底层操作系统的socket事件的处理(在服务端时事件包括客户端 ...

  7. 基于ASP.NET core的MVC站点开发笔记 0x01

    基于ASP.NET core的MVC站点开发笔记 0x01 我的环境 OS type:mac Software:vscode Dotnet core version:2.0/3.1 dotnet sd ...

  8. MySQL实验 内连接优化order by+limit 以及添加索引再次改进

    MySQL实验 内连接优化order by+limit 以及添加索引再次改进 在进行子查询优化双参数limit时我萌生了测试更加符合实际生产需要的ORDER BY + LIMIT的想法,或许我们也可以 ...

  9. elasticsearch集群配置 (Tobe Continue)

    elasticsearch集群配置 (Tobe Continue)   准备 首先需要在每个节点有可以正常启动的单节点elasticsearch   elasticsearch集群配置仅需要在elas ...

  10. Apache Hudi重磅特性解读之全局索引

    1. 摘要 Hudi表允许多种类型操作,包括非常常用的upsert,当然为支持upsert,Hudi依赖索引机制来定位记录在哪些文件中. 当前,Hudi支持分区和非分区的数据集.分区数据集是将一组文件 ...