【问题标题】:calculating hours between two dates and time in javascript在javascript中计算两个日期和时间之间的小时数
【发布时间】:2021-12-01 09:35:11
【问题描述】:

我正在尝试计算两个不同日期和时间的总小时数和分钟数:

下面是我的代码:

let startShiftTime = moment(StartTime, ['DD-MM-YYYY h:mm:ss A'])
    .utcOffset(0, false)
    .format('DD-MM-YYYY hh:mm:ss A');

let endShiftTime = moment(EndTime, ['DD-MM-YYYY h:mm:ss A'])
    .utcOffset(0, false)
    .format('DD-MM-YYYY hh:mm:ss A');

var TotalSeconds = moment(startShiftTime, 'DD-MM-YYYY hh:mm:ss A')
    .utcOffset(0, false)
    .diff(
        moment(endShiftTime, 'DD-MM-YYYY hh:mm:ss A').utcOffset(0, false),
        'seconds',
    );

var hours = Math.floor(TotalSeconds / 3600);
var minutes = Math.floor((TotalSeconds / 60) % 60);
console.log(
    'startShiftTime: ',
    startShiftTime,
    ' endShiftTime: ',
    endShiftTime,
    ' hours: ',
    hours,
    ' minutes: ',
    minutes,
);

我在所有情况下都得到小时和分钟,除了时间差是 1 小时,否则

控制台输出:

startShiftTime:  02-12-2021 09:00:00 AM  endShiftTime:  01-12-2021 09:30:00 PM  hours:  11  minutes:  30
startShiftTime:  02-12-2021 04:30:00 PM  endShiftTime:  02-12-2021 05:00:00 PM  hours:  -1  minutes:  -30

在第二个输出中看到...时差只有 30 分钟..但以小时为单位,我得到了 1

我无法理解我在哪里犯了错误

【问题讨论】:

    标签: javascript react-native datetime momentjs


    【解决方案1】:

    你不需要自己做这些计算,但你可以使用moment.duration API:

    const startShiftTime = moment('01-12-2021 09:00:00 AM', 'DD-MM-YYYY hh:mm:ss A');
    const endShiftTime = moment('01-12-2021 09:30:00 AM', 'DD-MM-YYYY hh:mm:ss A');
    
    const duration = moment.duration(startShiftTime.diff(endShiftTime));
    
    console.log('as hours: ' + duration.asHours(), 'as minutes: ' + duration.asMinutes());
    console.log('hours: ' + duration.hours(), 'minutes: ' + duration.minutes());
    <script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.1/moment.min.js"></script>

    PS:您会得到负值,因为差异是在开始时间完成的,小于结束时间。如果您想要正值,则只需反转差异:endShiftTime.diff(startShiftTime)

    【讨论】:

      【解决方案2】:

      为什么startShiftTimeendShiftTime 是格式化字符串而不是moment 的实例。你最终会再次解析它们。

      你计算的时间差应该是错误的。

      endShiftTime
          .diff(startShiftTime,'seconds')
      

      这就引出了一个明显的问题,为什么第一个示例计算正确......因为结束班次时间在开始时间之前,这没有任何意义。

      在您的第一个示例中交换开始时间和结束时间,然后在两种情况下都得到正确答案。

      function calculate(StartTime, EndTime) {
      
        let startShiftTime = moment(StartTime, ['DD-MM-YYYY h:mm:ss A'])
          .utcOffset(0, false);
      
        let endShiftTime = moment(EndTime, ['DD-MM-YYYY h:mm:ss A'])
          .utcOffset(0, false);
      
        var TotalSeconds = endShiftTime
          .diff(startShiftTime,'seconds');
          
        var hours = Math.floor(TotalSeconds / 3600);
        var minutes = Math.floor((TotalSeconds / 60) % 60);
        console.log(`startShiftTime: ${startShiftTime.format('DD-MM-YYYY h:mm:ss A')} endShiftTime: ${endShiftTime.format('DD-MM-YYYY h:mm:ss A')} hours: ${hours} minutes: ${minutes}`);
      }
      
      calculate('01-12-2021 09:30:00 PM', '02-12-2021 09:00:00 AM');
      calculate('02-12-2021 04:30:00 PM', '02-12-2021 05:00:00 PM');
      <script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.1/moment.min.js"></script>

      【讨论】:

        猜你喜欢
        • 2014-02-28
        • 2021-10-09
        • 1970-01-01
        • 1970-01-01
        • 2012-01-31
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多