1

JavaScript を使用して 2 つの日付間の経過時間を特定しようとしています。例: 「2008 年 1 月 5 日の午前 3 時に禁煙しました。禁煙してから何年、何ヶ月、何時間経過しましたか?」.

だから私の考えは次のとおりでした:

  1. 「終了」日を取得する
  2. 現在の日付を取得する
  3. 時間に変換 (ミリ秒)
  4. 違いを見つける
  5. 差分を使用して新しい日付を作成する
  6. その日付から年、月などを抽出します

うーん、おかしな動作をしており、その理由を特定することはできません。洞察はありますか?

//create custom test date
var d1 = new Date(2012, 8, 28, 13, 14, 0, 0);
//create current date
var d2 = new Date();
//get date times (ms)
var d1Time = (d1.getTime());
var d2Time = (d2.getTime());
//calculate the difference in date times
var diff = d2 - d1;
//create a new date using the time differences (starts at Jan 1, 1970)
var dDiff = new Date();
dDiff.setTime(diff);
//chop off 1970 and get year, month, day, and hour
var years = dDiff.getFullYear() - 1970;
var months = dDiff.getMonth();
var days = dDiff.getDate();
var hours = dDiff.getHours();

この一時的なホストで実際に動作しているのを見ることができます。

4

5 に答える 5

0

各種注意事項:

  • new Date(2012, 8, 28, 13, 14, 0, 0);2012 年 9 月 28 日 13:14:00 (8 月ではない)
  • new Date(0)戻り値は定数ではありません。これは、夏時間を使用するためです。
  • dDiff.getMonth();Jan の場合は 0、Feb の場合は 1 などを返します。
  • 日付の始まり (1970 年 1 月 1 日) で始まる1ので、差額でこれを差し引く必要があります。

2点目はあなたのミスだと思います。

あなたのアルゴリズムに従って、これを試してください:

// create date in UTC
//create custom test date
var dlocaltime = new Date(2012, 8, 28, 13, 14, 0, 0);
var d1 = new Date(dlocaltime.getUTCFullYear(),dlocaltime.getUTCMonth(), dlocaltime.getUTCDate(), dlocaltime.getUTCHours(),dlocaltime.getUTCMinutes(),dlocaltime.getUTCSeconds());
//create current date
var now = new Date();
var d2 = new Date(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate(),  now.getUTCHours(), now.getUTCMinutes(), now.getUTCSeconds());
console.log(d1);
console.log(d2);
//get date times (ms)
var d1Time = (d1.getTime());
var d2Time = (d2.getTime());


//calculate the difference in date times
var diff = d2 - d1;
//create a new date using the time differences (starts at Jan 1, 1970)
var dDiff = new Date();
dDiff.setTime(diff);
//chop off 1970 and get year, month, day, and hour
var years = dDiff.getUTCFullYear() - 1970;
var months = dDiff.getUTCMonth();
var days = dDiff.getUTCDate()-1; // the date of new Date(0) begin with 1 
var hours = dDiff.getUTCHours();
var minutes = dDiff.getUTCMinutes();
var seconds = dDiff.getUTCSeconds();
console.log("Years:"+years);
console.log("months:"+months);
console.log("days:"+days);
console.log("hours:"+hours);
console.log("minutes:"+minutes);
console.log("seconds:"+seconds);
于 2012-10-04T19:33:37.677 に答える
0

値を計算するために数学を実行しないのはなぜですか? あなたが行うときに日付に何を入れているかは、あなたにとってdDiff.setTime(diff);無意味です。これは、エポックからの日付diffミリ秒を提供するだけです。

于 2012-10-04T19:12:37.640 に答える
0

コードの一部を変更すると、問題が解決する場合があります。jsfiddle

var start = new Date(0); // pivote point of date.
var years = dDiff.getFullYear() - start.getFullYear();
var months = dDiff.getMonth() -  start.getMonth();
var days = dDiff.getDate() -  start.getDate();
var hours = dDiff.getHours() - start.getHours();;
console.log(years, months, days, hours);​

ただし、その値に基づいてこれらの値を操作する必要があります (負の値になる場合があります)。

于 2012-10-04T19:17:32.860 に答える
0

Date2 つの日付の間の期間ではなく、特定の時点を表します。dDiffUNIXエポックから経過したミリ秒を設定することにより、新しい日付を作成しています。

ミリ秒が経過したら、必要な情報を分割して抽出する必要があります。この質問を参照してください

Moment.jsを見ることをお勧めしますか?

于 2012-10-04T19:17:38.970 に答える
0

うるう日を考慮していないため、これは正確ではありません。それ以外は正常に動作しており、問題は見当たりません。時差は約6.5日。タイムゾーンと 0 が 1 月 1 日であるという事実を考慮すると、表示される値は予想どおりです。

正確な解決策は、

  • 時差を日数に換算する
  • 指定された日付から経過したうるう年の数を引きます
  • 残りを 365 で割り、日数を取得します。
  • 各月の日数を含む配列を作成し (閏日を考慮せずに)、経過した月をループして、完了した月の日数を減算します。反復回数が月のカウントになります
  • 残りはあなたの日数です
于 2012-10-04T19:26:03.313 に答える