如何使用 d3-scale time 获取两个日期之间的日期

How to get dates between two dates using d3-scale time

我需要获取两天之间的日期,但问题是使用 d3 scaleTime 小时、分钟和秒变为零。它会自动舍入时间。有什么办法可以覆盖吗?

我在 antd Slider 中使用这个格式化数据

我试过的

function App() {
  const start = moment().hour(8).minute(30);;
  const end = moment().add(10, 'months').hour(8).minute(30);
  const dateTicks2 = d3.scaleTime()
    .domain([+start, +end])
    .ticks(10).reduce((initial, current) => {
      return {
        ...initial,
        [current]: moment(current).format('YYYY-MM-DD HH:mm:ss'),
      };
    }, {});

  return ( <
    div > {
      JSON.stringify(dateTicks2, null, 2)
    } <
    /div>
  );
}
ReactDOM.render( < App / > , document.getElementById("root"));
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/7.0.0/d3.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3-scale/0.0.1/scale.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.1/moment.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>
<div id="root"></div>

如何获得包含小时和分钟的实际日期 请帮忙!

我不确定你的问题,但通过这种方式你可以获得当前时、分、秒的日期。

我给你两种使用矩方法的方法。第一种是从当前日期推断 hourminuteseconds,并将它们设置在 reduce 函数中。

const hour = moment().hour();
const minute = moment().minute();
const second = moment().second();

...

[current]: moment(current).hour(hour).minute(minute).second(second).format('YYYY-MM-DD HH:mm:ss')

否则第二种方法是从今天午夜获取第二个并将其添加到 current 日期。

const seconds = moment().diff(moment().startOf('day'), 'seconds');

...

[current]: moment(current).add(seconds, 'seconds').format('YYYY-MM-DD HH:mm:ss'),

最后的片段:

function App() {
  const start = moment().hour(8).minute(30);;
  const end = moment().add(10, 'months').hour(8).minute(30);

  const hour = moment().hour();
  const minute = moment().minute();
  const second = moment().second();
  
  const seconds = moment().diff(moment().startOf('day'), 'seconds');
  
  console.log(seconds)

  const dateTicks2 = d3.scaleTime()
    .domain([+start, +end])
    .ticks(10).reduce((initial, current) => {

      return {
        ...initial,
        // [current]: moment(current).hour(hour).minute(minute).second(second).format('YYYY-MM-DD HH:mm:ss'),
        [current]: moment(current).add(seconds, 'seconds').format('YYYY-MM-DD HH:mm:ss'),
      };
    }, {});

  return ( <
    div > {
      JSON.stringify(dateTicks2, null, 2)
    } <
    /div>
  );
}
ReactDOM.render( < App / > , document.getElementById("root"));
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/7.0.0/d3.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3-scale/0.0.1/scale.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.1/moment.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>
<div id="root"></div>