热门标签 | 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;
}

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

 

 

 

 

 


推荐阅读
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • JavaSE笔试题-接口、抽象类、多态等问题解答
    本文解答了JavaSE笔试题中关于接口、抽象类、多态等问题。包括Math类的取整数方法、接口是否可继承、抽象类是否可实现接口、抽象类是否可继承具体类、抽象类中是否可以有静态main方法等问题。同时介绍了面向对象的特征,以及Java中实现多态的机制。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • 本文介绍了一个Java猜拳小游戏的代码,通过使用Scanner类获取用户输入的拳的数字,并随机生成计算机的拳,然后判断胜负。该游戏可以选择剪刀、石头、布三种拳,通过比较两者的拳来决定胜负。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 本文介绍了在Java中gt、gtgt、gtgtgt和lt之间的区别。通过解释符号的含义和使用例子,帮助读者理解这些符号在二进制表示和移位操作中的作用。同时,文章还提到了负数的补码表示和移位操作的限制。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 猜字母游戏
    猜字母游戏猜字母游戏——设计数据结构猜字母游戏——设计程序结构猜字母游戏——实现字母生成方法猜字母游戏——实现字母检测方法猜字母游戏——实现主方法1猜字母游戏——设计数据结构1.1 ... [详细]
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社区 版权所有