【问题标题】:Calculate days between dates with decimals用小数计算日期之间的天数
【发布时间】:2013-10-28 09:22:41
【问题描述】:

我需要用 6 位小数计算两个日期之间的天数。我正在使用以下function

/**
 * Calculates the day difference for two given dates.
 * 
 * @param {Date} from , the start date
 * @param {Date} to , the end date
 * 
 * @return {Number} the day difference
 */
function calculateDayDifference( from, to ) {
    var dayDifference;
    const ONEDAY = 1000 * 60 * 60 * 24;

    if ( from != null && to != null ) {     
        dayDifference = Math.abs( from - to ) / ONEDAY;
    }
    return dayDifference;
}

问题是,以下示例的计算不正确:

  • 23.10.2013 10:0001.11.2013 00:00

它返回 8.625,但正确的值是 8,583333。这个错误的值differs 1 hour from the correct value

以下情况:

  • 01.11.2013 00:0007.11.2013 10:00

返回值6,416667是正确的。

【问题讨论】:

  • 您的夏令时似乎有问题。当我们回到 CET 时,在 2013 年 10 月 27 日 03:00 CEST(我的时区)“添加”了一小时。恐怕 Javascript 没有开箱即用的处理 DST 的规定。
  • See

标签: javascript date datetime time


【解决方案1】:

这是由于夏令时。

代码运行良好,8.625 是这两个日期之间的正确时间。如果您不想处理时间变化,请使用 UTC 时间,它没有夏令时,并且(几乎?)所有语言都可用。

【讨论】:

  • 谢谢,您的提示很有用,但如果我使用 UTC,我会得到值 8,666667 而不是 8,583333
  • 您确定将 UTC 与 UTC 进行比较吗?这是一个精确的 2 小时差异,这意味着您将 UTC-2 时区与中性 UTC 进行比较。
  • 我用:var fromUTC = new Date( from.getUTCFullYear(), from.getUTCMonth(), from.getUTCDate(), from.getUTCHours(), from.getUTCMinutes(), from.getUTCSeconds() ), toUTC = new Date( to.getUTCFullYear(), to.getUTCMonth(), to.getUTCDate(), to.getUTCHours(), to.getUTCMinutes(), to.getUTCSeconds() );,然后计算dayDifference = Math.abs( fromUTC - toUTC ) / ONEDAY;
【解决方案2】:

使用.toFixed(6)

function calculateDayDifference( from, to ) {
    var dayDifference;
    const ONEDAY = 1000 * 60 * 60 * 24;

    if ( from != null && to != null ) {     
        dayDifference = (Math.abs( from - to )).toFixed(6); / ONEDAY;
    }
    return dayDifference;
}

【讨论】:

    【解决方案3】:

    在 javascript Math.abs 函数中,可能会在浮点值之后给出舍入精度点。

    我已经测试了一个示例,您可以使用此.toFixed(6) 进行检查,您可能会得到解决方案。

    today=new Date()
    var christmas=new Date(today.getFullYear(), 11, 25) 
    if (today.getMonth()==11 && today.getDate()>25) 
    christmas.setFullYear(christmas.getFullYear()+1) 
    var one_day=1000*60*60*24
    
    document.write(((christmas.getTime()-today.getTime())/(one_day)).toFixed(6)+"
    days left until Christmas!")
    

    欢迎提问, 谢谢,

    【讨论】:

      【解决方案4】:

      对我来说,解决方法是在代码中添加以下内容:

      if ( from.getTimezoneOffset( ) !== to.getTimezoneOffset( ) ) {
          if ( from.getTimezoneOffset( ) < to.getTimezoneOffset( ) ) {
              to.setHours( to.getHours( ) - 1 );
          } else if ( from.getTimezoneOffset( ) > to.getTimezoneOffset( ) ) {
              to.setHours( to.getHours( ) + 1 );
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2013-09-16
        • 1970-01-01
        • 2015-02-26
        • 2019-09-27
        • 2017-08-11
        • 1970-01-01
        相关资源
        最近更新 更多