Я пишу это неправильно или это ошибка в Date.js (дата ниндзя) - PullRequest
1 голос
/ 06 октября 2011

Я пытаюсь использовать 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 );

Я ожидаю около -584 дней в соответствии с расчетами даты в Excel и других онлайн-сервисах. Вот что я получил:

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

У меня есть файл локализации для datejs для дат в новозеландском стиле, поэтому я не ожидаю, что это станет проблемой. Хотя, похоже, это проблема. Кроме того, если я проанализирую дату, а затем отобразлю ее как строку в том же формате, в котором она находилась до анализа, она не должна измениться, да?

Длинный день, может быть, мне просто нужен перерыв. Ваши мысли / помощь интернету?

Ответы [ 2 ]

0 голосов
/ 22 ноября 2011

Проблема определенно вызвана значением work.tax_credit_start string (?). Парсер 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() И у вас есть контроль над форматом этого значения, лучше всего передать в формате ISO yyyy-MM-dd.
  2. Если вы ожидаете объект Date, возвращаемый из Date.parse(), лучше проверить это значение по null, чтобы убедиться, что у вас действительно есть действительный Date объект.

Следующий пример демонстрирует проверку значения null d1, а затем установку значения по умолчанию, если null.

* 1 036 ** +1037 * Пример * * тысяча тридцать-девять
var d1 = Date.parse("30-00-2010"); // Not a valid Date

if (!d1) {
    d1 = new Date();
}

console.log(d1); // will be 'now'

Приведенный выше пример можно очистить, передав значение по умолчанию прямо при установке переменной.

* ** 1044 тысяча сорок-три * Пример * * тысяча сорок-шести
var d1 = Date.parse("30-00-2010") || new Date();

console.log(d1); // will be 'now'

Надеюсь, это поможет.

0 голосов
/ 06 октября 2011

Во-первых, 30-00-2010 будет решено как ср 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);
}
...