【问题标题】:check for the same day from epoch time从纪元时间检查同一天
【发布时间】:2018-11-24 22:30:13
【问题描述】:

我正在像这样从服务器获取纪元时间值列表

response = [[1317888000000, 372.5101, 375, 372.2, 372.52],
[1317888060000, 372.4, 373, 372.01, 372.16],
[1317888120000, 372.16, 372.4, 371.39, 371.62],
[1317888180000, 371.62, 372.16, 371.55, 371.75],
[1317888240000, 371.75, 372.4, 371.57, 372],
[1317888300000, 372, 372.3, 371.8, 372.24],
[1317888360000, 372.22, 372.45, 372.22, 372.3],
[1317888420000, 372.3, 373.25, 372.3, 373.15],
[1317888480000, 373.01, 373.5, 373, 373.24],
[1317888540000, 373.36, 373.88, 373.19, 373.88],
[1317888600000, 373.8, 374.34, 373.75, 374.29],
[1317888660000, 374.29, 374.43, 374, 374.01],
[1317888720000, 374.05, 374.35, 373.76, 374.35],
[1317888780000, 374.41, 375.24, 374.37, 374.9],
[1317888840000, 374.83, 375.73, 374.81, 374.96],
[1317888900000, 374.81, 375.4, 374.81, 375.25],
[1317888960000, 375.2, 375.7, 375.14, 375.19],
[1317889020000, 375.43, 375.43, 374.75, 374.76],
[1317889080000, 374.94, 375.5, 374.81, 375.13],
[1317889140000, 375.12, 375.48, 375, 375.04],
[1317889200000, 375.24, 375.24, 375, 375.08],
[1317889260000, 375.16, 375.16, 374.51, 374.51],
[1317889320000, 374.51, 374.75, 374.2, 374.27]]

在此,有些纪元值也像同一天,同一月和同一年,但时间有所不同。例如

1317888000000 = Thursday, October 6, 2011 8:00:00 AM
1317900000000 = Thursday, October 6, 2011 11:20:00 AM
1317920000000 = Thursday, October 6, 2011 4:53:20 PM

我的要求是,如果我得到新一天的值然后在我的图表中,那么我将在图表中添加一个新点,但如果新值是同一天但不同的时间,那么我会用新值和新时间更新同一天的值。

类似

var last = this.chart.series[0].lastValue;
if(//last is of same day but different time){
   //update the last value
} else {
   //add the new value
}

那么有什么方法可以检查纪元时间是否属于同一天。我使用new Date(1317888000000).getDay() 进行了尝试,但它不能正确满足要求,因为如果即将到来的值是下个月的同一天。它将更新最后一个而不是添加新值。我应该在 if 循环中写入什么条件,以便它可以检查图表中添加的最后一个值以及新值是否属于同一天。

【问题讨论】:

  • “同一天”在哪个时区?
  • 只需比较getDaygetMonthgetFullYear ?
  • @Phil 其实我对时区不太了解。我正在使用 highcharts,因此它直接接受带有值的纪元时间。现在我的要求已更改为检查同一天的值。如果我们将其转换为 ISO 字符串或语言环境日期会怎样。有什么办法吗?
  • @JonasW。我有很多值,接近 60000+ 并不断增加。这是检查同一天价值的好方法吗?我是从性能的角度来问的。
  • @YashJain 与渲染图表相比,过滤大数据数组将是沧海一粟

标签: javascript epoch


【解决方案1】:

假设您想在本地时区工作,您可以将数组缩减为由 day(即一天的开始)键入的 Map数据是。

例如

const latestDataByDay = response.reduce((map, val) => {
  let day = new Date(val[0])
  day.setHours(0);
  day.setMinutes(0);
  day.setSeconds(0);
  day.setMilliseconds(0);
  return map.set(day.getTime(), val)
}, new Map())

然后你可以从

中得到一个值数组
Array.from(latestDataByDay.values())

感谢this answer 了解如何将日期四舍五入到一天的开始

【讨论】:

  • 我试过了,它给了我一系列不同的日子。我的问题是如何检查我从图表中获得的最后一个值是否与我正在比较的服务器的新值在同一天。对不起我的英语。
  • @YashJain 在您的问题中可能更清楚,但您可以使用相同的逻辑将时间戳下降到一天的开始,以便与另一个时间戳进行比较
  • 我会详细说明的。当我开始接收值时,首先我将检查图表是否为空值。在开始时它必须是空的。所以添加第一个值。现在随着下一个值的到来,从时间中获取最后一个值(纪元时间)并检查两者是否属于同一天。如果相同,则更新图表,否则在图表中添加新值
  • 对不起,我的理解。我已经更新了我的问题。
【解决方案2】:

纪元时间戳从纪元开始以毫秒为单位指定。因此,要获得纪元以来的天数,您只需要划分:

daysSinceEpoch = timestamp / (24 * 60 * 60 * 1000)

因为一秒有 1000 毫秒,一分钟有 60 秒,一小时有 60 分钟,一天有 24 小时。

然后,您可以使用Math.floor() 将该数字向下舍入,以便UTC 时间同一天的所有时间戳都给出相同的值,并进行比较。

【讨论】:

  • 假设一天正好是 86400000 毫秒,这是一个完全幼稚的假设
  • @Phil 怎么这么幼稚?你能找到任何证据证明纪元时间系统解释了地球实际上可能没有在恰好 86400000 毫秒内完成自转这一事实吗?
  • 抱歉,更正一下,假设两个日期之间的所有天数都恰好是 86400000 毫秒长是很幼稚的
猜你喜欢
  • 2012-03-12
  • 2016-07-12
  • 2021-08-10
  • 2016-03-23
  • 1970-01-01
  • 2020-04-08
  • 2022-11-25
  • 1970-01-01
  • 2011-12-11
相关资源
最近更新 更多