JodaTime - 检查 LocalTime 是否在现在之后以及现在在另一个 LocalTime 之前

2023-12-14

我正在尝试检查当前时间是否是在开始之后LocalTime在另一个终点之前LocalTime即开始时间加上 11 小时。如果开始时间为 11:00(结束时间为 22:00),则效果很好。但是,当我尝试比较开始时间 16:00 和结束时间 03:00 时,currentTime.isBefore(endTime)永远不会被记录,但它应该被记录。

LocalTime currentTime = LocalTime.now(); //21:14
LocalTime startTime = new LocalTime( 16, 00, 0, 0);
LocalTime endTime = startTime.plusHours(11); //03:00 Midnight

    if(currentTime.isAfter(startTime)){
        Log.v("Test", "After startTime");
    }

    if(currentTime.isBefore(endTime)){
        Log.v("Test", "Before endTime");
    }

有什么想法如何解决这个问题吗?


基本上你需要检查你的startTime and endTime是倒置的(即如果endTime是在之前startTime)。如果是,那一定是“夜间”间隔,您应该将其视为相反的情况,然后反转结果。

public boolean isWithinInterval(LocalTime start, LocalTime end, LocalTime time) {
    if (start.isAfter(end)) {
        return !isWithinInterval(end, start, time);
    }
    // This assumes you want an inclusive start and an exclusive end point.
    return start.compareTo(time) <= 0 &&
           time.compareTo(end) < 0;
}

现在唯一的奇怪之处是,如图所示,开始时间通常是包含的,而结束时间是排除的 - 而如果我们反转结果(和参数),我们就会有一个包含的结束时间和一个排除的开始时间。因此,您可能想明确地处理这些情况:

public boolean isWithinInterval(LocalTime start, LocalTime end, LocalTime time) {
    if (start.isAfter(end)) {
        // Return true if the time is after (or at) start, *or* it's before end
        return time.compareTo(start) >= 0 ||
               time.compareTo(end) < 0;
    } else {
        return start.compareTo(time) <= 0 &&
               time.compareTo(end) < 0;
    }
}

(你如何选择你使用的目标和参数compareTo当然,这取决于你。有多种方法可以有效地编写相同的代码。)

简短但完整的示例:

import org.joda.time.LocalTime;

public class Test {
    public static void main(String[] args) {
        LocalTime morning = new LocalTime(6, 0, 0);
        LocalTime evening = new LocalTime(18, 0, 0);
        LocalTime noon = new LocalTime(12, 0, 0);
        LocalTime midnight = new LocalTime(0, 0, 0);
        System.out.println(isWithinInterval(morning, evening, noon)); // true
        System.out.println(
            isWithinInterval(morning, evening, midnight)); // false
        System.out.println(
            isWithinInterval(evening, morning, noon)); // false
        System.out.println(
            isWithinInterval(evening, morning, midnight)); // true
    }

    public static boolean isWithinInterval(LocalTime start, 
                                           LocalTime end,
                                           LocalTime time) {
        if (start.isAfter(end)) {
            // Return true if the time is after (or at) start,
            // *or* it's before end
            return time.compareTo(start) >= 0 ||
                time.compareTo(end) < 0;
        } else {
            return start.compareTo(time) <= 0 &&
                time.compareTo(end) < 0;
        }
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JodaTime - 检查 LocalTime 是否在现在之后以及现在在另一个 LocalTime 之前 的相关文章

随机推荐

  • 将 Data.frames 列表重新组合成单​​个数据帧[重复]

    这个问题在这里已经有答案了 如果这个问题已经得到解答 我很抱歉 另外 这是我第一次上 stackoverflow 我有一个关于列表 数据框和的初学者 R 问题merge and or rbind 我从一个看起来像这样的面板开始 COUNTR
  • Selenium webdriver (javascript) 选项卡输出

    填写表格时 测试需要按选项卡才能转到下一个字段 我得到的错误是 InvalidArgumentError Not a modifier key Code var key require selenium webdriver Key var
  • 未设置带有或带有块的对象变量

    我有一个正在尝试解析的 xml 文件 这是xml文件内容
  • 获取 DOM 节点的字符串表示形式

    Javascript 我有一个节点 元素或文档 的 DOM 表示 我正在寻找它的字符串表示 例如 var el document createElement p el appendChild document createTextNode
  • 如何使用 socket.io 存储来自特定用户的套接字资源?

    我正在设计一个聊天脚本 我使用不同的浏览器在我的机器上测试它 我正在尝试使用 socket io 向特定用户发送消息 所以这里是 client socket on msgFromServer function data message da
  • 在使用 PHP 和 AJAX 执行期间终止 MySQL 查询

    我正在创建一个自定义查询生成器 当用户创建查询时 他可以通过单击按钮来验证查询语法 当用户单击按钮进行验证时 AJAX 调用将发送到服务器 并开始执行查询 在此期间 用户可以在屏幕上看到带有取消按钮的模式 如果用户有任何机会单击取消按钮 我
  • tableView.cellForRowAtIndexPath 返回 nil 单元格过多(快速)

    所以我有最奇怪的事情 我正在循环 tableView 以迭代所有单元格 对于少于 5 个单元 它可以正常工作 但是对于更多单元 它会崩溃并显示 意外发现 nil 这是代码 for section in 0
  • Qt:meta.enumeratorCount() 没有为 Q_OBJECT 中的枚举提供元数据,为什么?

    我有以下课程 我尝试获取一些元数据enum MyEnum 然而 当循环结束时meta enumeratorCount 它的计数始终为 0 基本上我在关注这个例子在这里 为了找到问题 我也尝试了同样的方法 同样的问题 方法计数 0 代码编译
  • 从一列中的唯一值创建 Pandas 数据框

    我有一个包含 1000 行的 Pandas 数据框 它有Names列包括客户名称及其记录 我想根据每个客户的唯一名称为他们创建单独的数据框 我将唯一的名称放入列表中 customerNames DataFrame customer name
  • Google Slides API,能够使用十六进制设置颜色吗?

    是否可以使用十六进制格式设置元素形状背景颜色 例如 B6D7A8 我在这里看到一个例子 Google Slides API 如何更改特定颜色的所有形状的文本颜色 然而 Google Slide API 参考并没有提及它 我想确定一下 特别是
  • MIME 类型“image/jpg”与“image/jpeg”相同吗?

    很简单的问题 但似乎无法在网上找到它 我正在尝试制作一个程序 根据文件类型会给我扩展名 No image jpg不等于image jpeg 你应该使用image jpeg Only image jpeg被识别为 JPEG 文件的实际 mim
  • 是否有主日期时间模式适用于每个类似的日期时间模式

    我的消费者收到的时间格式是String有价值20 5 14 9 22 25 or 20 5 14 9 22 5 or 20 5 14 12 22 25 or 20 10 14 9 2 25 etc 以上所有内容都有非常不同的日期时间模式yy
  • struts 2中的多个文件上传

    我在使用struts2上传文件时遇到问题 我有多个文件标签 例如
  • 如何在matlab中用scatter3图在同一图中绘制等值面?

    我有一个 3D 体积和一个 3D 点云 我怎样才能绘制点云以及isosurface体积 而不覆盖散点图 使用patch绘制等值面总是会擦掉scatter3 plot 有些事情要尝试 首先绘制使用补丁的表面 h patch 然后设置hold
  • 无法连接 Websphere MQ 队列管理器

    我是 WebSphere MQ 的初学者 我正在研究 MQ 6 并且它工作正常 但现在我已经安装了 MQ 7 1 当我尝试创建一个新的队列管理器时 我可以做到 但它无法连接并且它给了我以下错误 你对此有什么想法吗 谢谢 如果使用以下命令安装
  • Linq 获取高于姓氏的项目

    问候 我正在尝试找到一种使用 Linq to SQL 来获取姓氏高于 Jan 的前 15 条记录的方法 当我在 SQL 中使用它时 我得到了姓氏以字母顺序高于 Jan 的任何字母开头的每个成员 然而使用query Where m gt m
  • Python Numpy 累积/差异[重复]

    这个问题在这里已经有答案了 我希望扭转 numpy 的 cumsum 函数的效果 即累积 运行总计 查看下面的代码 我将数字 1 到 10 分配给 a 将这些数字的运行总和分配给 b 我需要反转这个过程 即从b计算a 我可以对此进行编码 参
  • 计算本地存储空间的使用情况

    我正在使用 Bespin 编辑器和 HTML5 的 localStorage 创建一个应用程序 它在本地存储所有文件并帮助语法 使用 JSLint 和其他一些 CSS 和 HTML 解析器来帮助用户 我想计算已使用了多少 localStor
  • 在 C# 中从外部应用程序获取 UI 文本

    是否可以从 C 中的外部应用程序获取 UI 文本 特别是 有没有办法从第三方编写的外部 Win32 应用程序的标签 我假设它是普通的 Windows 标签控件 读取 Unicode 文本 文本可见 但无法在 UI 中通过鼠标选择 我假设有一
  • JodaTime - 检查 LocalTime 是否在现在之后以及现在在另一个 LocalTime 之前

    我正在尝试检查当前时间是否是在开始之后LocalTime在另一个终点之前LocalTime即开始时间加上 11 小时 如果开始时间为 11 00 结束时间为 22 00 则效果很好 但是 当我尝试比较开始时间 16 00 和结束时间 03