- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有两个对象日历
Calendar startCalendar = new GregorianCalendar(2013,0,31);
Calendar endCalendar = new GregorianCalendar();
我想知道上面列出的两个日期之间的间隔是否被n个其他对象对日历覆盖而没有间隔之间的空洞
示例 1:
Calendar startCalendar1(2013,0,31);
Calendar endCalendar1(2014,0,31);
Calendar startCalendar2(2013,5,31);
Calendar endCalendar2();
很好
例子2:
Calendar startCalendar1(2013,0,31);
Calendar endCalendar1(2014,0,31);
Calendar startCalendar2(2014,2,31);
Calendar endCalendar2();
不好
我使用 Java 6谢谢
最佳答案
第一种方法:仅使用 Java 6
当我看到像 2015-01-31
这样的日期示例时,我强烈怀疑您说的是截止日期间隔,否则选择月末可能显得有点奇怪。这是一种广泛传播且合理的方法。不幸的是,选择像 java.util.Calendar
这样代表瞬间(也是日期-时区组合)的数据类型与闭区间不协调。这种类似即时的类型在半开间隔下效果更好。结果是:
如果您决定只使用 Java-6 类型,那么您可以按照@guillaume girod-vitouchkina 的建议,尝试将所有 Calendar
对象转换为表示自 Unix 纪元以来经过的毫秒数的长值(以我的投票为例,如何在没有任何外部库的情况下执行此操作)。 但是您必须提前为每个Calendar
对象(如果表示结束边界)添加额外的一天,以达到关闭日期间隔的效果。
当然,您仍然需要自己做一些自己开发的区间算术,如该答案中粗略显示的那样。如果你仔细研究其他提案和你自己的需求,你会发现最终的解决方案甚至需要的不仅仅是一个新的区间类或区间的基本比较。您还需要一个更高的抽象层,即在几个间隔之间定义操作。自己做这一切可能会引起一些头痛。另一方面:如果您具有良好的编程技能,那么实现基于 Long 的区间算法可能会节省一些性能开销,这是典型的额外区间库。
第二种方法:使用专用的区间库
我只知道四个 promise 处理间隔的库。不能使用@Basil Bourque 提到的Threeten-Extra,因为它需要Java-8。它的间隔类的缺点是只能处理瞬间,不能处理日历日期。也几乎不支持处理间隔集合。 Joda-Time 也是如此(它至少在 Java-6 上工作并且还提供专用的日历日期类型,即 LocalDate
但没有日期间隔)。
一个有趣的选择是使用 Guava 及其类 RangeSet ,特别是如果您决定继续使用 Calendar
-objects 和 Longs。这个类对处理间隔之间的操作有一些支持——对我来说比使用简单的 Joda-Time 间隔类更有吸引力。
最后,您还可以选择使用我的库 Time4J,它有 range-package .我现在将针对您的问题展示一个完整的解决方案:
// our test interval
PlainDate start = PlainDate.of(2013, Month.JANUARY, 31);
PlainDate end = SystemClock.inLocalView().today();
DateInterval test = DateInterval.between(start, end);
IntervalCollection<PlainDate> icTest = IntervalCollection.onDateAxis().plus(test);
// two intervals for your GOOD case
PlainDate s1 = PlainDate.of(2013, Month.JANUARY, 31);
PlainDate e1 = PlainDate.of(2014, Month.JANUARY, 31);
DateInterval i1 = DateInterval.between(s1, e1);
PlainDate s2 = PlainDate.of(2013, Month.MAY, 31);
PlainDate e2 = end; // today
DateInterval i2 = DateInterval.between(s2, e2);
IntervalCollection<PlainDate> goodCase =
IntervalCollection.onDateAxis().plus(i1).plus(i2);
boolean covered = icTest.minus(goodCase).isEmpty();
System.out.println("Good case: " + covered); // true
// two intervals for your BAD case
PlainDate s3 = PlainDate.of(2013, Month.JANUARY, 31);
PlainDate e3 = PlainDate.of(2014, Month.JANUARY, 31);
DateInterval i3 = DateInterval.between(s3, e3);
PlainDate s4 = PlainDate.of(2014, Month.MARCH, 31);
PlainDate e4 = end; // today
DateInterval i4 = DateInterval.between(s4, e4);
IntervalCollection<PlainDate> badCase =
IntervalCollection.onDateAxis().plus(i3).plus(i4);
covered = icTest.minus(badCase).isEmpty();
System.out.println("Bad case: " + covered); // false
代码的最大部分只是区间构造。真正的区间运算本身是由这个小得惊人的代码片段完成的:
boolean covered =
IntervalCollection.onDateAxis().plus(test).minus(
IntervalCollection.onDateAxis().plus(i1).plus(i2)
).isEmpty();
说明:如果test减去i1和i2的余数为空,则测试区间被区间i1和i2覆盖。
顺便说一句:默认情况下,Time4J 中的日期区间是闭区间。但是,如果您确实需要,可以将这些间隔更改为半开间隔(只需在给定的日期间隔内调用 withOpenEnd()
)。
如果您打算稍后迁移到 Java-8,您只需将 Time4J 版本更新到版本 4.x(v3.x 版本适用于 Java-6)并非常容易地转换为 Java-8 类型像 java.time.LocalDate
(例如:PlainDate.from(localDate)
或 LocalDate ld = plainDate.toTemporalAccessor()
)这样你就可以即使在未来,也可以继续使用 Time4J 来获得标准 Java 未涵盖的额外功能。
关于java - 找出一系列日期是否涵盖一个时间间隔,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34312128/
我的数据库中有两张表,一张用于 field ,另一张用于预订。我需要的是一个查询来选择所有未预订的 field 。见下文: 餐 table 预订具有以下字段: bk_id venue_id 作为(预订
嗨,我是编码新手,我有一些培训项目,其中包括从 HTML 表单输入 MySQL 数据库。它就像你玩过的游戏的日志。第一个日期输入是您开始游戏的时间,第二个日期输入是您完成游戏的时间。但我需要检查器或类
我是这个 sql 编码的新手,我正在尝试学习新的东西。因此,我创建了一个交货表,其中包含一些属性,如商品代码、交货日期、交货数量。所以如何从同一张表中获取第一个交货日期(最小日期)和交货数量以及最晚交
我从支付网关返回了这个日期 2014-05-15T08:40:52+01:00 我得到 2014-05-15T08:40:52 但我无法识别时区 +01:00 的含义 我的位置时区是 UTC−06:0
我快要疯了,请帮忙。 我有一列包含日期时间值。 我需要找到每天的最小值和最大值。 数据看起来像这样 2012-11-23 05:49:26.000 2012-11-23 07:55:43.000
我从 json 数据中获取日期为 2015 年 4 月 15 日晚上 10:15我只想在 html 页面中显示 json 响应数据的时间,例如 10:15 PM这里我放了我的js函数和html代码 J
是否有 javascript 库或其他机制允许我将 .NET 日期/时间格式字符串(即 yyyy-MM-dd HH:mm:ss)传递给 javascript函数并让它相应地解析提供的日期时间值?我一直
我正在使用以下代码以正确的格式获取当前的 UTC 时间,但客户返回并要求时间戳现在使用 EST 而不是 UTC。我搜索了 Google 和 stackoverflow,但找不到适用于我现有代码的答案。
我有以下日期的平均温度数据。我想找到连续至少 5 天低于或高于 0 摄氏度的开始日期。 date_short mean.temp 1 2018-05-18 17.54 2 2018-05-19
它可以在其他网络浏览器中使用,但 IE11 返回无效日期。 为了调试我使用了下面的代码。 console.log('before - ' + date.value); date.value = new
我在 Excel 中有一个数据的 Web 提取,其中日期列带有/Date(1388624400000)/。我需要在 Excel 中将其转换为日期。 最佳答案 能够从 here 中推断出它. 假设字符串
嗨,我的 Schmema 有一个带有 ISO 日期的字段: ISODate("2015-04-30T14:47:46.501Z") Paypal 在成功付款后以该形式返回日期对象: Time/Date
我的 table : CREATE TABLE `tbdata` ( `ID` INT(10) NOT NULL AUTO_INCREMENT, `PatientID` INT(10) NOT
我正在 Ubuntu 服务器 12.04 中编写一个 shell 脚本,它应该比较日志文件中的一些数据。在日志文件中,日期以以下格式给出: [Mon Apr 08 15:02:54 2013] 如您所
我想使用 GROUP BY WITH ROLLUP 创建一个表并获取总行数而不是 null。 $sql ="SELECT IF(YEAR(transaktioner.datum
我正在创建博客文章,在成功迁移我的博客文件后,当我转到我网站的博客页面时返回一个错误(无法解析其余部分:':“Ymd”'来自'post.date|date: "Ymd"') 我似乎无法确定这是语法错误
我正在尝试获取要插入到 CAML 查询中的月份范围,即:2010-09-01 和 2010-09-30。 我使用以下代码生成这两个值: var month = "10/2010"; var month
如何将代码document.write("直到指定日期")更改为writeMessage(date)中的日期?此外,writeMessage(date) 中的日期未正确显示(仅显示年份)。感谢您帮助解
我在 Windows (XP) 和 Linux 上都尝试过 utime()。在 Windows 上我得到一个 EACCES 错误,在 Linux 上我没有得到任何错误(但时间没有改变)。我的 utim
我正在尝试计算发生在同一日期的值的总和(在 XYZmin 中)。 我的数据看起来像这样, bar <- structure(list(date = structure(c(15622, 15622,
我是一名优秀的程序员,十分优秀!