【问题标题】:Determine if local datetime is within a datetime window [duplicate]确定本地日期时间是否在日期时间窗口内[重复]
【发布时间】:2020-09-13 20:47:20
【问题描述】:

我正在编写代码以确定当前本地日期时间是否在日期时间范围内,即开始和结束日期时间。

我首先将开始和结束日期时间值作为序列化的 GMT 字符串(这是源系统返回给我的):

let myStartDate = "2020-09-11T14:15:13.000Z";
let myEndDate = "2020-09-15T01:09:34.000Z";

然后我将日期时间转换为 UTC 格式:

let startDate = new Date(myStartDate).toUTCString();
let endDate = new Date(myEndDate).toUTCString();
let now = new Date().toUTCString();

然后我检查now是否在startDateendDate之间:

if (now > startDate && now < endDate) {
  console.log("You're INSIDE the datetime window!");
} else {
  console.log("You're OUTSIDE the datetime window!");
}

console.log("Now:   " + new Date(now));
console.log("Start: " + new Date(startDate));
console.log("End:   " + new Date(endDate));

当我运行它时,我的代码告诉我我在日期时间窗口之外,即使开始和日期时间值是我当前日期时间前后几天。

我看到的另一种方法是使用 getTime(),它将日期时间转换为 UTC 毫秒数。

let startDate = new Date(myStartDate).getTime();
let endDate = new Date(myEndDate).getTime();
let now = new Date().getTime();

这似乎可行,但我很困惑为什么不能以同样的方式评估 toUTCString()

【问题讨论】:

  • toUTCString() 的输出应该是字符串?我希望数字或日期值不是范围比较的首选。
  • @jidexl21 正确,我记错了,不是字符串,是数字
  • typeof ((new Date()).toUTCString()) 返回字符串。
  • 如果你的字符串是 ISO 8601 格式,你不需要转换为 Date 对象,字符串会像日期一样准确地进行词法比较。如果您使用 toISOString 字符串比较也将起作用,因为它会返回与您正在解析的字符串相同的字符串,即new Date("2020-09-11T14:15:13.000Z").toISOString() === "2020-09-11T14:15:13.000Z"
  • @RobG 我最初在修改toISOString(),但我了解到它现在已被弃用,所以使用toUTCString()

标签: javascript date datetime time


【解决方案1】:

无需转换成字符串,可以自己比较Date对象。在进行此类比较时,Date 对象会转换为数字(相当于 getTime())

由于每个时区偏移量相同,并且您的原始字符串已经是 UTC,因此 UTC 在比较中不会真正相关

请注意,对于 ==!=,由于对象相等规则,比较需要转换为 getTime()

let myStartDate = new Date("2020-09-11T14:15:13.000Z");
let myEndDate = new Date("2020-09-15T01:09:34.000Z");

let today = new Date();

console.log(today >= myStartDate && today <= myEndDate)

【讨论】:

  • 感谢您解释铸造部分,这将使它更容易(更少的代码)。
  • 类似地,你可以从另一个中减去一个也导致毫秒的差异
【解决方案2】:

嗯,

toUTCString 仅将时间转换为带有 UTC tz 的时间字符串。
大多数语言,包括 JavaScript 都不知道如何将字符串转换为可比较的日期。

让我们做一个思考练习:

“1”或“2”哪个更大? “2”
哪个更大,“a”或“b”? "b"
哪个更大,“a”或“A”? "a"

所以比较是基于 Ascii 的。

所以如果数值越大 -> 字符串越大

【讨论】:

    猜你喜欢
    • 2013-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-26
    • 2012-05-27
    • 2014-05-31
    • 1970-01-01
    相关资源
    最近更新 更多