2011-10-06 41 views
1

我想使用datejs(日期忍者或whathaveyou ..)和我正在奇怪的结果。 下面是我输出到控制台进行测试。我写这个错误的或者这是Date.js(日期忍者)的错误

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新西兰风格的本地化文件日期了,所以我不希望这是一个问题。虽然它似乎是问题。另外,如果我解析一个日期,然后将它作为一个字符串呈现,它与解析之前的格式相同,它不应该改变是啊?

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

回答

0

首先,30-00-2010将被解析成星期三2009年12月30日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); 
} 
+0

哦,并且自开始日期在结束日期之前,标志不应该是+ ve? – RobG

+0

非常感谢! – dibs

0

问题绝对是您的work.tax_credit_start字符串值造成的。解析失败时,Datejs解析器将返回一个null值。

在您的示例中,将从null日期中减去d1。这将返回一个意外的数字值。然后,您将该“意外”号码传递给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(),你必须控制该值的格式,最好通过ISO格式yyyy-MM-dd
  2. 如果您预计从Date.parse()返回的对象为Date,最好检查该值与null以确保您确实拥有有效的Date对象。

下面演示检查的d1一个null值,这时如果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' 

希望这有助于。

相关问题