这个问题在这里已有答案:
我正在尝试使用D3和React Native 制作这样的图形
现在我正在尝试使用开始和结束日期列表来定义我的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
这是我试过的:
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))
})
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”
这会有用吗?
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
}
})
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])
我想到了。我找到了毫秒
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])