热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

java判断当前时间是否在指定时间段内包含时区及跨天时间段

背景:一句话需求“我需要判断当前是否在一段时间内”目前网上提供了很多方法,但是都是考虑了一种情况,这种情况就是先假定这个时间段是发生在同一天,比如“00:00-23:59”,“00

背景:一句话需求“我需要判断当前是否在一段时间内”

目前网上提供了很多方法,但是都是考虑了一种情况,这种情况就是先假定这个时间段是发生在同一天,比如“00:00-

23:59” ,“00:00-18:00”,

代码很简单,copy一段网上代码

 

《java 判断当前时间是否在指定时间段内包含时区及跨天时间段》

 

但是如果考虑到跨天呢?比如 “18:00-06:00”,

“07:00-06:59”就没法很直接的判断了。

如果按上述代码 当前时间为00:46,那么我们大脑一想肯定是符号当前时间段的,但是代码却会判断不在当前时间范围内

为了满足上面案例,我的解决方案是,先判断结束时间是否小于开始时间,如果true,则认为是跨天,将开始时间减一天,结束时间按当前时间算。

 

尝试改下代码

 

 

《java 判断当前时间是否在指定时间段内包含时区及跨天时间段》

main方法跑一下试试:

 

 

《java 判断当前时间是否在指定时间段内包含时区及跨天时间段》

成功了。

似乎解决了问题。但是尝试想一下如果当前时间是”2019-05-25 19:00“呢,理论上说也是符合设定时间段的(测试的时间段”18:00-06:00“)

main跑一下试试:

 

《java 判断当前时间是否在指定时间段内包含时区及跨天时间段》

代码返回了false

说明我们的逻辑有问题,原因就是我们无法确定这个时间段的开始日期和结束日期,只能通过传入的日期作为比较。上述逻辑如果DEBUG或者仔细想一下就会发现,一旦确定跨天,开始时间就变成了

传入时间减一天,即2019-05-25 18:00~2019-05-26 06:00,那么传入的时间是 2019-05-26 19:00,自然不在时间段内了。

 

那么我把当前结束时间+1天不就解决了这个问题么,是的,我当时也是这么想的,但是如果传入时间是00:46会发现他返回了false,就像打地鼠一般,这边打下去了,那边又上来了

 

所以单纯的开始时间-1,结束时间+1都是解决不了这个问题,仔细想想之后,我又想出了一个问题,如果当前时间超过12点就 把结束时间+1,没超过就把开始时间+1不就完了么?

尝试修改如下:

 

《java 判断当前时间是否在指定时间段内包含时区及跨天时间段》

在跑跑上面的两个案例 即当前时间为“2019-05-26 00:46:00”和 “2019-05-26 19:46:00”

这两个都应该返回true,才对。

《java 判断当前时间是否在指定时间段内包含时区及跨天时间段》

 

《java 判断当前时间是否在指定时间段内包含时区及跨天时间段》

似乎解决了问题,就在我写这个总结之前我以为都是没毛病的,但是我忽然将时间段改为“20:00-17:59”时,好像又不好使了,如下

《java 判断当前时间是否在指定时间段内包含时区及跨天时间段》

我的当前时间是16:46分,按照我设置的时间段想法应该只有18:00-19:59分是返回false,其他都应该在该时间段范围内,然后结果是返回了false!

 

看来这些方法都是行不通的,直接用时间比较是否可以?尝试修改代码如下:

《java 判断当前时间是否在指定时间段内包含时区及跨天时间段》

把当前时间的日期也去掉,都放在同一天比较,如果当前时间大于等于开始时间或者小于等于结束时间测试上面案例都得到理论结果。

最后放出带时区校验的方法:

/**
* 比较当前时间 是否在timeArray 范围内
* @param timezone 时区
* @param timeArray 开始时间,结束时间
* @return
*/
public static boolean isInDate(Date now,String[] timeArray,String pattern,String timezone){
SimpleDateFormat sdf = new SimpleDateFormat(pattern);
TimeZone timeZOne= TimeZone.getTimeZone(timezone);
sdf.setTimeZone(timeZone);
//转换为对应时区时间
Date date = DateUtils.stringToDate(sdf.format(now),pattern);
Date start = DateUtils.stringToDate(timeArray[0],pattern);
Date end = DateUtils.stringToDate(timeArray[1],pattern);
if (start.after(end) || start.equals(end)) {
/**
* 直接用时间判断
*/
if (date.getTime() >= start.getTime() || date.getTime() <= end.getTime()) {
return true;
}
}else {
if (date.getTime() >= start.getTime() && date.getTime() <= end.getTime()) {
return true;
}
}
return false;
}

总结:遇事不能钻牛角尖,当一个方法想不通尝试换个思路试试。之前我一直在和当前日期上纠结不能自已。,导致一直无法完美的解决这么简单的问题!

 

 

 

 

 


推荐阅读
  • 零拷贝技术是提高I/O性能的重要手段,常用于Java NIO、Netty、Kafka等框架中。本文将详细解析零拷贝技术的原理及其应用。 ... [详细]
  • 在多线程并发环境中,普通变量的操作往往是线程不安全的。本文通过一个简单的例子,展示了如何使用 AtomicInteger 类及其核心的 CAS 无锁算法来保证线程安全。 ... [详细]
  • 字节流(InputStream和OutputStream),字节流读写文件,字节流的缓冲区,字节缓冲流
    字节流抽象类InputStream和OutputStream是字节流的顶级父类所有的字节输入流都继承自InputStream,所有的输出流都继承子OutputStreamInput ... [详细]
  • 本文深入探讨了Java多线程环境下的同步机制及其应用,重点介绍了`synchronized`关键字的使用方法和原理。`synchronized`关键字主要用于确保多个线程在访问共享资源时的互斥性和原子性。通过具体示例,如在一个类中使用`synchronized`修饰方法,展示了如何实现线程安全的代码块。此外,文章还讨论了`ReentrantLock`等其他同步工具的优缺点,并提供了实际应用场景中的最佳实践。 ... [详细]
  • Spring – Bean Life Cycle
    Spring – Bean Life Cycle ... [详细]
  • DAO(Data Access Object)模式是一种用于抽象和封装所有对数据库或其他持久化机制访问的方法,它通过提供一个统一的接口来隐藏底层数据访问的复杂性。 ... [详细]
  • Java高并发与多线程(二):线程的实现方式详解
    本文将深入探讨Java中线程的三种主要实现方式,包括继承Thread类、实现Runnable接口和实现Callable接口,并分析它们之间的异同及其应用场景。 ... [详细]
  • 如何在Java中使用DButils类
    这期内容当中小编将会给大家带来有关如何在Java中使用DButils类,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。D ... [详细]
  • 本文详细介绍了 PHP 中对象的生命周期、内存管理和魔术方法的使用,包括对象的自动销毁、析构函数的作用以及各种魔术方法的具体应用场景。 ... [详细]
  • 检查在所有可能的“?”替换中,给定的二进制字符串中是否出现子字符串“10”带 1 或 0 ... [详细]
  • 在 Java 中,`join()` 方法用于使当前线程暂停,直到指定的线程执行完毕后再继续执行。此外,`join(long millis)` 方法允许当前线程在指定的毫秒数后继续执行。 ... [详细]
  • 本题探讨如何编写程序来计算一个数值的整数次方,涉及多种情况的处理。 ... [详细]
  • 在软件开发过程中,经常需要将多个项目或模块进行集成和调试,尤其是当项目依赖于第三方开源库(如Cordova、CocoaPods)时。本文介绍了如何在Xcode中高效地进行多项目联合调试,分享了一些实用的技巧和最佳实践,帮助开发者解决常见的调试难题,提高开发效率。 ... [详细]
  • 在 Linux 环境下,多线程编程是实现高效并发处理的重要技术。本文通过具体的实战案例,详细分析了多线程编程的关键技术和常见问题。文章首先介绍了多线程的基本概念和创建方法,然后通过实例代码展示了如何使用 pthreads 库进行线程同步和通信。此外,还探讨了多线程程序中的性能优化技巧和调试方法,为开发者提供了宝贵的实践经验。 ... [详细]
  • 本文介绍了在 Java 编程中遇到的一个常见错误:对象无法转换为 long 类型,并提供了详细的解决方案。 ... [详细]
author-avatar
济河南岸_797
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有