在 js 中仅比较间隔内的时间

Comparing times only within an interval in js

提问人:Lemour 提问时间:11/3/2023 更新时间:11/3/2023 访问量:43

问:

我试图在js中只比较时间(无论日期如何)。首先,我需要一种方法来比较时间,所以我遇到了运行良好的 luxon 库。

但是,在比较午夜的间隔时存在问题。例如:should 计算结果为 true,则 luxon 的库返回 false。这是有道理的,因为在不同的时间间隔内可以进行不同的评估。这些是我所期望的:20:00 < 01:00 < 10:0020:00 < 01:00

20:00 < 01:00 < 10:00 == true // but it evaluates as false using luxon's interval

00:00 < 01:00 < 10:00 == true

这是我目前拥有的代码:

const from = DateTime.fromISO('20:00');
const to = DateTime.fromISO('10:00');
const value = DateTime.fromISO('01:00');

const interval = Interval.fromDateTimes(from, to);

console.log(interval.contains(valueTime)); // returns false instead of true
JavaScript 日期时间 Luxon

评论


答:

0赞 Helge Derenthal 11/3/2023 #1

在 的日期中减去 ,如果大于 。 如果它大于 ,则在 天减去 ,以使其进入区间。fromfromtovalueto

let from = luxon.DateTime.fromISO('20:00');
const to = luxon.DateTime.fromISO('10:00');
let value = luxon.DateTime.fromISO('01:00');

if(from > to)
{
  from = from.minus({ days: 1 });
}

if(value > to)
{
  value = value.minus({ days: 1 });
}

const interval = luxon.Interval.fromDateTimes(from, to);

console.log(interval.contains(value));
<script src="https://cdnjs.cloudflare.com/ajax/libs/luxon/3.4.3/luxon.min.js" integrity="sha512-gUQcFuEaDuAEqvxIQ9GDdMcCeFmG5MPnoc6ruJn+nyCNHrHM2oB97GOVLIOiixzTxPYmIfEQbOoQmx55UscLyw==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>

测试不同的值:

19:00 -> false
21:00 -> true
01:00 -> true
09:00 -> true
11:00 -> false

似乎是期望的行为。

评论

0赞 mplungjan 11/3/2023
如果一个大于另一个,那将不起作用。所以从10:00到第二天23:00
0赞 mplungjan 11/3/2023 #2

您需要日期,除非 to 总是小于 from across midnight

const from = luxon.DateTime.fromISO('2023-11-03T20:00');
const to = luxon.DateTime.fromISO('2023-11-04T10:00');
const valueTime = luxon.DateTime.fromISO('2023-11-04T01:00');

const interval = luxon.Interval.fromDateTimes(from, to);
console.log(from.toString(),"\n",to.toString(),"\n",valueTime.toString())
console.log(interval.contains(valueTime)); // returns false instead of true
<script src="https://cdnjs.cloudflare.com/ajax/libs/luxon/3.4.3/luxon.min.js" integrity="sha512-gUQcFuEaDuAEqvxIQ9GDdMcCeFmG5MPnoc6ruJn+nyCNHrHM2oB97GOVLIOiixzTxPYmIfEQbOoQmx55UscLyw==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>