我正在尝试使用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本地化文件,所以我不希望这是一个问题。虽然这似乎是个问题。另外,如果我解析一个日期然后将其渲染为一个字符串,其格式与解析之前的格式相同,那么它应该不会改变吗?
漫长的一天,也许我只是需要休息一下。 您的想法/帮助互联网?
答案 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
我对您的原始样本提出了一些建议:
Date.parse()
并且您可以控制该值的格式,则最好传递yyyy-MM-dd
的ISO格式。Date
返回Date.parse()
对象,则最好针对null
检查该值,以确保您确实拥有有效的Date
对象。 以下演示了检查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'
希望这有帮助。