需求背景

我的需求是获取当前时间之后的下一个“整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. 微信小程序上传Word文档、PDF、图片等文件

    <view class="main" style="border:none"> <view class="title"&g ...

  2. 设计模式系列之代理模式(Proxy Pattern)——对象的间接访问

    说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修炼之道)>一书的阅读笔记.个人感觉这本书讲的不错,有兴趣推荐读一读.详细内容也可以看看此书作者的博客https:/ ...

  3. 暑假集训Day0

    啊这 跟学长学的要写日记 希望到时候能写省选集训的总结 咳咳 今天上午做了一上午苦力好像让老苏夸了难以接受(年纪两百考到年级两千他居然没有干我) 上午搞卫生搞到了十点半………… 替女生拉包提东西了!! ...

  4. 几个常见CSS错误和解决办法

    1.IE6下,当float存在时,margin双倍的问题 解决方法:加display:inline; 例: #content {    float: left;     width: 500px;   ...

  5. SQL中的ON DUPLICATE KEY UPDATE使用详解

    一:主键索引,唯一索引和普通索引的关系主键索引 主键索引是唯一索引的特殊类型. 数据库表通常有一列或列组合,其值用来唯一标识表中的每一行.该列称为表的主键. 在数据库关系图中为表定义一个主键将自动创建 ...

  6. Spring 获取单例流程(一)

    读完这篇文章你将会收获到 在 getBean 方法中, Spring 处理别名以及 factoryBean 的 name Spring 如何从多级缓存中根据 beanName 获取 bean Spri ...

  7. 标记下 'net 查壳/脱壳/加壳' 工具

    net查壳工具 DotNet Id v1.0.0.3 该net程序集被“MaxToCode”加壳了(也不能完全相信). 加壳工具就是列表中列出的了. de4Net.exe脱壳工具版本de4dot-v3 ...

  8. 使用Tensorflow对模型进行量化

    本文旨在将迁移学习训练好的模型基于tensorflow工具进行量化. 环境配置及迁移学习部分可参考博文[https://www.cnblogs.com/hayley111/p/12887853.htm ...

  9. (私人收藏)红色项目工作计划总结汇报PPT模板

    红色项目工作计划总结汇报PPT模板 https://pan.baidu.com/s/1fr-PB7ieveSIqSXrB0YXsgbgdc

  10. Mysql中交换行操作

    博客已搬家,更多内容查看https://liangyongrui.github.io/ Mysql中交换行操作 leetcode的一道题目 参考:https://leetcode.com/proble ...