我写错了这个或者这是Date.js上的错误(日期忍者)

时间:2011-10-06 04:42:34

标签: javascript timespan datejs

我正在尝试使用datejs(date ninja或whathaveyou ..)而且我得到了奇怪的结果。 这是我输出到控制台进行测试的内容。

var d1 = Date.today();
var d2 = Date.parse(work.tax_credit_start);
var span2 = new TimeSpan(d2 - d1);

console.log('result of timespan test = ' + span2.getDays() + 'days between now and ' + Date.parse(work.tax_credit_start).toString('dd-mm-yyyy') + ' - ' + work.tax_credit_start );

根据excel和其他在线服务的日期计算,我预计大约-584天。 这就是我得到的:

result of timespan test = -462days between now and 30-00-2010 - 30-06-2010

我也有新西兰风格日期的datejs本地化文件,所以我不希望这是一个问题。虽然这似乎是个问题。另外,如果我解析一个日期然后将其渲染为一个字符串,其格式与解析之前的格式相同,那么它应该不会改变吗?

漫长的一天,也许我只是需要休息一下。 您的想法/帮助互联网?

2 个答案:

答案 0 :(得分:0)

首先,30-00-2010将被解决为Wed Dec 30 2009 00:00:00。那是你真正想要的吗?

其次,30-00-2010和30-06-2010之间的天数相差仅超过6个月的几天,你怎么得到-584天?我得到-182。

无论如何,这不是一个困难的计算。为所需日期创建两个日期对象,将其时间设置为中午(以便在日期之间删除夏令时问题),从另一个中减去一个,将结果除以一天中的毫秒数(24 * 60 * 60 * 1000)并舍入到最接近的整数。

这是一些快速完成工作的功能:

// Iput as d/m/y or d-m-y
function dmyToDate(s) {
  var bits = s.split(/[-/]/);
  return new Date(bits[2], --bits[1], bits[0]);
}


// Difference between dates in days. If only one date supplied,
// today is used for endDate
// Copy startDate so don't mess it up
function daysBetweenDates(startDate, endDate) {

  endDate = typeof endDate == 'string'? dmyToDate(endDate) : new Date();
  startDate = typeof startDate == 'string'? dmyToDate(startDate) : new Date(startDate);
  endDate.setHours(12,0,0);
  startDate.setHours(12,0,0);

  var diff = startDate - endDate;
  var ms = 24 * 60 * 60 * 1000; // or 8.64e7

  return Math.round(diff/ms);
}

答案 1 :(得分:0)

问题肯定是由您的work.tax_credit_start字符串(?)值引起的。如果解析失败,Datejs解析器将返回null值。

在您的示例中,d1日期将减去null。这将返回意外的数字值。然后,您将该“意外”数字传递给TimeSpan构造函数,这将返回一些意外的.days值。

这是您原件的工作样本。

示例

var d1 = Date.parse("2010-01-30");
var d2 = Date.parse("2010-06-30");

var span2 = new TimeSpan(d2 - d1);

span2.days // 150 days

我对您的原始样本提出了一些建议:

  1. 如果您将字符串值传递到Date.parse()并且您可以控制该值的格式,则最好传递yyyy-MM-dd的ISO格式。
  2. 如果您期望从Date返回Date.parse()对象,则最好针对null检查该值,以确保您确实拥有有效的Date对象。
  3. 以下演示了检查null d1值,然后设置为null时的默认值。

    示例

    var d1 = Date.parse("30-00-2010"); // Not a valid Date
    
    if (!d1) {
        d1 = new Date();
    }
    
    console.log(d1); // will be 'now'
    

    在设置变量时,可以通过传递默认值来清除上面的示例。

    示例

    var d1 = Date.parse("30-00-2010") || new Date();
    
    console.log(d1); // will be 'now'
    

    希望这有帮助。