【问题标题】:How to compare timestamp by hours using moment如何使用时刻按小时比较时间戳
【发布时间】:2019-04-17 18:57:24
【问题描述】:

我有以下函数负责根据服务器返回的 Unix 时间戳返回一个布尔值,具体取决于截止期是否处于活动状态。

函数如下:

 export const isCutOffTimePeriod = function (currentDateTime) {
  const format = 'HH:mm a'
  const currentTime = moment(currentDateTime).utcOffset(-300)
  const openingTime = moment('8:00 am', format)
  const closingTime = moment('2:30 pm', format)


  return !currentTime.isBetween(openingTime, closingTime)
}

我正在 Jest 中为此功能编写测试:

 it('Should allow a transfer between 8:30am and 2:30pm ', () => {
  const currentDateTime = mockData.dateTime.nineAm // 1527862941959 - Friday,June 1, 2018 9:22:21.959 AM GMT-05:00
  expect(Utils.isCutOffTimePeriod(currentDateTime)).toEqual(false)
})

即使基于输出的所有时间都正确地存储在基于日志的时刻对象中,测试也失败了,如何仅根据小时和分钟将 unix 时间戳与其他时间进行比较?

【问题讨论】:

  • [jest] 标签是指 js 测试框架,对吗?那么正确的标签是 [jestjs]。 [jest] 标签用于 ElasticSearch 的 Java HTTP Rest 客户端。
  • 工作正常,因为 9.20am 介于 8.30am 和 2.30pm 之间
  • 我的测试失败了,因为函数返回 true
  • 您是否要检查转换为本地时间的时间戳是否在上午 8:30 到下午 2:30 之间?

标签: javascript react-native jestjs momentjs


【解决方案1】:

您可以使用.startOf('minute').endOf('minute')。像这样:

您可以直接将 Unix 时间戳传递给 Moment 以创建反映该时间戳的对象。这里:

function test(unixTimestampForComparasion) {
  const format = 'HH:mm a';
  var currentDateTime = moment(unixTimestampForComparasion);
  const openingTime = moment('8:00 am', format).startOf('minute');
  const closingTime = moment('2:30 pm', format).endOf('minute');
  
  return !currentDateTime.isBetween(openingTime, closingTime)
}

console.log(test(moment("08:00:20 am", 'HH:mm:ss a').valueOf()));
console.log(test(moment("2:30:20 pm", 'HH:mm:ss a').valueOf()));
console.log(test(moment("2:31:00 pm", 'HH:mm:ss a').valueOf()));

var testTimeAsUnixTimestamp = moment("2019-01-01 2:31:00 pm", 'HH:mm:ss a').valueOf();
console.log(testTimeAsUnixTimestamp);
console.log(test(testTimeAsUnixTimestamp));
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.24.0/moment-with-locales.js"></script>

请理解您正在反转 inBetween 测试。所以结果可能有点混乱。但他们是正确的。

我还删除了语言环境偏移线,因此示例变得更加清晰。只需再次包含它,您就可以让它工作。

【讨论】:

  • 这个方法可以应用于unix时间戳吗? currentDateTime 将类似于 1527862941959
  • 查看我的编辑。如果您将其包含在最初的问题中会更好,以便其他用户更容易理解。
  • 它包含在最初的问题中,实际上是问题的标题,所以如果知道答案会如何?
  • 当指定时间戳时它只会失败。
  • 是的……重读一遍,发现你是对的。编辑了答案。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-07-09
  • 2011-12-28
  • 2019-07-30
  • 2012-05-16
  • 2012-09-15
  • 2021-03-16
  • 1970-01-01
相关资源
最近更新 更多