【问题标题】:Compare time in an array to verify if it is incremented by 2 hours比较数组中的时间以验证它是否增加了 2 小时
【发布时间】:2020-01-10 13:54:51
【问题描述】:

所以我有一个时间格式的字符串数组,例如“6pm”或“5am”。我想验证数组中的元素是否增加了 2 小时。我首先使用 .replace 删除 pm 和 am 并获取第一个和下一个元素之间的差异以查看它是否为 2,但在 '12am'、'2am' 和 '12pm'、'2pm' 之间的时间有问题.所以我想将其转换为 24 小时或分钟,但仍然遇到同样的问题。如果元素增加 2 小时或者是否有一个按日期比较的库,我不确定如何将其转换为比较。这是我所拥有的:

const exampleArr = ['6pm', '8pm', '10pm', '12am', '2am', '4am', '6am', '8am', '10am', '12pm'];
const modifiedTempArr = [];

for(let i = 0; i < exampleArr.length; i++) {
  let temp = exampleArr[i].replace('pm', '').replace('am', '');
  //console.log(temp);
  let timeInMin = temp * 60;
  console.log(timeInMin);
  modifiedTempArr.push(timeInMin);
}

// or
for(let i = 0; i < exampleArr.length; i++) {
  var momentObj = moment(exampleArr[i], ["hA"]);
  console.log(momentObj.format("HH:mm")); 
}

// also tried this
var d1 = new Date(parseInt(exampleArr[3])); // 12am
var d2 = new Date(parseInt(exampleArr[4])); // 2am
let timeDifference = Math.abs(d2.getTime() - d1.getTime());
console.log(timeDifference); // got 10

【问题讨论】:

  • “或者如果有一个按日期比较的库”。在 JavaScript 中,几乎所有东西都有一个库......
  • 我想这个链接会帮助你stackoverflow.com/questions/23620498/…
  • @VaishakHolla 我确实看到了那个链接,但是它会比较它是之前还是之后。我想看看 2 个元素之间的小时数有什么区别

标签: javascript node.js


【解决方案1】:

就我个人而言,我会将它们映射到 24 小时开始并循环查看数字是否加 2 并检查是否使用模数包装。

const textEveryTwo = data => {
  const hours = data.map(t => t === '12am' ? 0 : t === '12pm' ? 12 : (t.includes('pm') ? 12 : 0) + parseInt(t))
  return hours.every((h, i, a) => {
    var next = (h % 24 + 2) % 24
    return a[i + 1] === undefined || a[i + 1] === next
  })
}

console.log(textEveryTwo(['6pm', '8pm', '10pm', '12am', '2am', '4am', '6am', '8am', '10am', '12pm']))
console.log(textEveryTwo(['5pm', '7pm', '9pm', '11pm', '1am', '3am', '5am', '7am', '9am', '11am', '1pm']))
console.log(textEveryTwo(['5pm', '7pm', '10pm', '11pm', '1am', '3am', '5am', '7am', '9am', '11am', '1pm']))

现在它可以只有一个循环,您只需每次转换数字即可。

const textEveryTwo = data => {
  const getHours = t => t === '12am' ? 0 : t === '12pm' ? 12 : (t.includes('pm') ? 12 : 0) + parseInt(t)
  return data.every((h, i, a) => {
    var next = (getHours(h) % 24 + 2) % 24
    return a[i + 1] === undefined || getHours(a[i + 1]) === next
  })
}

console.log(textEveryTwo(['6pm', '8pm', '10pm', '12am', '2am', '4am', '6am', '8am', '10am', '12pm']))
console.log(textEveryTwo(['5pm', '7pm', '9pm', '11pm', '1am', '3am', '5am', '7am', '9am', '11am', '1pm']))
console.log(textEveryTwo(['5pm', '7pm', '10pm', '11pm', '1am', '3am', '5am', '7am', '9am', '11am', '1pm']))

【讨论】:

  • 如果 11p->1a 是预期的测试用例,我不确定转换为 24 小时格式后您能获得多少收益。
  • @WBT 你看到第二个测试用例了吗?
  • 我看到它在那里,但不确定 24 小时系统转换提供了多少收益。如果 +2 值是 >base pre-modulo,则您必须进行取模并翻转 am/pm 字母,因此更改为 24 小时制并不能真正简化事情,反而会增加复杂性。
  • 不确定它是如何使事情复杂化的。如果您不转换它而不是添加 2,如果它超过 12,那么您必须减去并查看下一个是否有上午/下午。无论哪种方式都是一样的。
  • @epascarello 谢谢,我没有这么想。可能需要对此进行更多研究
【解决方案2】:

假设您已经在使用 moment.js https://jsfiddle.net/y70foawq/ 检查这个jsfiddle

let beginningTime = moment('8:45am', ["h:mm A"]);
let endTime = moment('9:00am', ["h:mm A"]);
let difference = moment.duration(endTime.diff(beginningTime));
let hours = difference.asHours();
console.log(hours)

您可以在此基础上根据您的要求检查您需要多少小时的差异。

【讨论】:

    【解决方案3】:

    这是一个简单的比较函数。

    function is2hDelayed(aHr, aDayHalf, bHr, bDayHalf) {
        if(aHr==12) {aHr = 0}
        if(bHr==12) {bHr = 0}
        return (aDayHalf == bDayHalf) ? (bHr == (aHr+2)) : ((bHr) == (aHr-10));
    }
    

    示例用法:is2hDelayed(11,"am",1,"pm") 应该返回 true

    它需要您提前进行一些解析以分隔时间的数字和字母部分,但具有能够在各种设置中重复使用的好处(例如,对“a”与“am”约定不敏感只要它是一致的;可以在给出分钟和秒的设置中使用。等等)。

    它也不会通过转换为 24 小时制来引入额外的复杂性,这仅有助于 am->pm 换行,而无需解决 pm->am。存在 12=>0 转换是因为半天的“开始”用 12 而不是 0 表示。

    请注意,此函数不涉及夏令时,并假定时区一致。 Obligatory XKCD.

    【讨论】:

    • 所以 aHr 和 bHr 是我们想要比较的时间,那么 aDayHalf 和 bDayHalf 会是什么。以及为什么需要这样做(aHr-10)。抱歉只是想了解更多
    • @na2193 我加了一个例子;这有帮助吗? -10+2 mod 12 简单。
    • @epascarello 错过了一个,修好了。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-09-23
    • 1970-01-01
    • 1970-01-01
    • 2021-07-02
    • 1970-01-01
    相关资源
    最近更新 更多