1

我正在尝试使用 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 本地化文件,所以我不认为这是一个问题。虽然这似乎是问题所在。另外,如果我解析一个日期,然后以与解析之前相同的格式将其呈现为字符串,它不应该改变是吗?

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

4

2 回答 2

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);
}
于 2011-10-06T06:00:11.487 回答
0

问题肯定是由您的work.tax_credit_startstring(?) 值引起的。如果解析失败,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()AND 您可以控制该值的格式,则最好传入 ISO 格式的yyyy-MM-dd.
  2. 如果您期望Date从 中返回一个对象Date.parse(),最好检查该值null以确保您确实拥有一个有效的Date对象。

下面演示了检查 的nulld1,然后设置为默认值 if 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'

希望这可以帮助。

于 2011-11-21T23:54:15.613 回答