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は、2009年12月30日水曜日00:00:00として解決されます。それはあなたが本当に欲しいものですか?

第二に、2010年9月30日と2010年6月30日の日数の差は、6か月を超える数日だけですが、どのようにして-584日を取得しますか?-182を取得します。

とにかく、それは難しい計算ではありません。必要な日付の2つの日付オブジェクトを作成し、それらの時刻を正午に設定し(日付間の夏時間の問題を取り除くため)、一方を他方から減算し、結果を1日のミリ秒数で除算します(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_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()その値の形式を制御できる場合は、 の ISO 形式で渡すのが最適ですyyyy-MM-dd
  2. 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'

お役に立てれば。

于 2011-11-21T23:54:15.613 に答える