Javascript / Momentjs:从一组日期中找到最小和最大时间的优雅方式? [重复]

问题描述 投票:1回答:3

这个问题在这里已有答案:

我正在尝试使用D3和React Native Graph制作这样的图形

现在我正在尝试使用开始和结束日期列表来定义我的Y轴。

我正在使用代码制作我的yScale:

const yScale = scaleTime()
  .domain([new Date(MIN_VALUE), new Date(MAX_VALUE)])
  .range([height, 0])

但我无法找出一个算法来定义MIN_VALUE和MAX_VALUE的输入内容

以下是示例日期:

const dates = [
{
  start: 2018-03-04T00:28:23-08:00 //Mar 4 12:28am
  end: 2018-03-04T09:44:46-08:00 //Mar 4 09:44 am
},
{
  start: 2018-03-02T22:25:24-08:00 //Mar 2 10:25 pm
  end: 2018-03-03T08:26:58-08:00 //Mar 3 08:26 am
},
{
  start: 2018-03-01T23:24:48-08:00 //Mar 1 11:24 pm
  end: 2018-03-02T07:44:27-08:00 //Mar 2 07:44 am
}
]

从这个例子来看,最短时间应该是晚上10:25,最长时间应该是早上8:26

这是我试过的:

  1. 我首先将所有日期转换为相对于开始日期的毫秒 const allYValues = [] data.map((report, idx) => { var start = moment(data.end).startOf('day').subtract(1, 'day') allYValues.push(moment(data.start).diff(start)) allYValues.push(moment(data.end).diff(start)) })
  2. 然后我以毫秒为单位传递最小值和最大值 const yScale = scaleLinear() .domain([new Date(Math.min(...allYValues)), new Date(Math.max(...allYValues))]) .range([height - paddingBottom, 0])

但是我得错了日期。例如,如果Math.min(... allYValues)= 80213000(毫秒)。如果我将其转换为小时和分钟应该是22:16,但是新的日期(Math.min(... allYValues))给了我“01 Jan 1970 02:16 pm”

javascript d3.js react-native momentjs
3个回答
0
投票

这会有用吗?

let min = moment(dates[0].start)
let max = moment(dates[0].end)

dates.forEach(element => {
  const start = moment(element.start);
  const end = moment(element.end);

  if (start < min) {
    min = start;
  }

  if (end > max) {
    max = end
  }
})

0
投票
var dates = [
{
  start: "2018-03-04T00:28:23-08:00",
  end: "2018-03-04T09:44:46-08:00"
},
{
  start: "2018-03-02T22:25:24-08:00",
  end: "2018-03-03T08:26:58-08:00"
},
{
 start: "2018-03-01T23:24:48-08:00",
  end: "2018-03-02T07:44:27-08:00"
}
]

var timeStamps = [];

for (var i = 0; i < dates.length; i++) {
    timeStamps.push(new Date(dates[i].start).getTime());
    timeStamps.push(new Date(dates[i].end).getTime());
}

timeStamps.sort();

console.log(timeStamps[0])
console.log(timeStamps[timeStamps.length-1])

0
投票

我想到了。我找到了毫秒

  var start = moment(data.end).startOf('day').subtract(1, 'day')

  allYValues.push(moment(data.start).diff(start))
  allYValues.push(moment(data.sleep.bed.end).diff(start))

找到最小值和最大值然后传入:

const yScale = scaleTime()
  .domain([new Date().setHours(minTime.hours(), minTime.minutes()), new Date().setHours(maxTime.hours(), maxTime.minutes())])
  .range([height - paddingBottom, 0])
© www.soinside.com 2019 - 2024. All rights reserved.