4

私は基本的に2つの日付を持ちたいです。

 var startDate = new Date("01/01/2001 01:00:00");
 var currentDate = new Date();

次に、 a 年 b 月 c 日 c 日 d 時間 e 秒 の形式で減算startDateして期間を取得したいと思います。currentDate

これまでのところ、私の問題は、ショートカットを使用する場合、つまり次のことです。

var duration = currentDate.getTime() - startDate.getTime();
var seconds = duration / 1000;
var minutes = duration / 1000 / 60;

等...

次に、たとえば、月が常に30日であるとは限らず、年が常に365日であるとは限らない(閏年)などの理由で、誤った期間が得られます。

Web や StackOverflow のさまざまな投稿を見てみましたが、ある日付を別の日付から正確に減算し、詳細 (年、月、日、時、分) を取得できる JavaScript メソッドの実例を見つけることができませんでした。 、秒) 結果日から。

私がやりたい方法でこれを行うことができるウェブサイトがあります:http://www.timeanddate.com

4

6 に答える 6

2

月の日数が異なるため、「正しい」結果が必要な場合、問題に対する明確で単純な解決策はありません。

しかし同時に、人間の脳は、大きな日付範囲になるとますますだらしなくなります。したがって、「1 年 11 か月」は「ほぼ 2 年」とほぼ同じ意味です。したがって、100% 正しい解決策から始める前に、仮に 30 日月を使用した場合に結果が十分に良いかどうかを自問してください。

それが本当にできない場合: 時間と分を取り除きます。彼らは混乱するだけです。両方とも午前 0 時に開始する 2 つの日付を作成します (つまり、HH:MM:SS は 00:00:00 です)。

問題は、それらの間に何日、何ヶ月、何年あるかということです。場合によります。6 月 1 日から 8 月 31 日までの時間はほぼ 2 か月ですが、2 つの日付の間に月はありません。です61 days, 0 months。それとも1 month, 30 days?どちらが正しい"?

数学的に正しい解は、ユーザーが苛立たしいと感じる最大 61 日間の差の結果をもたらします。

人間の解は数学的に正しくないため、人間の時間感覚を偽造するヒューリスティックをコード化する必要があります。

そのため、多くのサイトで、日付が 30 日以上異なる場合に「1 か月以上」と表示され、「半年」、「1 年」(330 ~ 380 日の間)、「1 年以上」と続く場合があります。彼らは、「正確な」結果を導き出そうとする代わりに、ずさんな人間の脳を有利に利用しています (a) どちらもあまり役に立ちませんし、b) 「正確な」が何を意味するのか、誰も本当に同意していません。 )。

于 2012-10-29T12:33:09.620 に答える
1

私はこの正確な問題に数日間苦労しています。最後に、私がうまくいくと思うものを作りました。今はくだらない、ずさんなコメントとばかげた変数名のように見えます。明日はクリーンアップを行います。しかし、必要な場合に備えて、とにかく投稿すると思いました。

編集:コードをクリーンアップし、その要点を作成しました。ここで確認してください: https://gist.github.com/4705863

EDIT2:くそー、バグが見つかりました。やってる。バグが修正され、正常に動作するようになりました!

    // Time difference function
function timeDiff(start, end) {
    //today, now!
    //Get the diff
    var diff = end - start;
    //Create numbers for dividing to get hour, minute and second diff
    var units = [
    1000 * 60 * 60 *24,
    1000 * 60 * 60,
    1000 * 60,
    1000
    ];

    var rv = []; // h, m, s array
    //loop through d, h, m, s. we are not gonna use days, its just there to subtract it from the time
    for (var i = 0; i < units.length; ++i) {
        rv.push(Math.floor(diff / units[i]));
        diff = diff % units[i];
    }

    //Get the year of this year
    var thisFullYear = end.getFullYear();
    //Check how many days there where in last month
    var daysInLastMonth = new Date(thisFullYear, end.getMonth(), 0).getDate();
    //Get this month
    var thisMonth = end.getMonth(); 
    //Subtract to get differense between years
    thisFullYear = thisFullYear - start.getFullYear();
    //Subtract to get differense between months
    thisMonth = thisMonth - start.getMonth();
    //If month is less than 0 it means that we are some moths before the start date in the year.
    // So we subtract one year, and add the negative number (month) to 12. (12 + -1 = 11)
    subAddDays = daysInLastMonth - start.getDate();
    thisDay = end.getDate();
    thisMonth = thisMonth - 1;
    if(thisMonth < 0){
        thisFullYear = thisFullYear - 1;
        thisMonth = 12 + thisMonth;
        //Get ends day of the month
    }
    //Subtract the start date from the number of days in the last month, add add the result to todays day of the month
    subAddDays = daysInLastMonth - start.getDate();
    subAddDays = thisDay + subAddDays;


    if(subAddDays >= daysInLastMonth){
        subAddDays = subAddDays - daysInLastMonth;
        thisMonth++;
        if (thisMonth > 11){
            thisFullYear++;
            thisMonth = 0;
        }
    }
    return {
        years: thisFullYear,
        months: thisMonth,
        days: subAddDays,
        hours: rv[1],
        minutes: rv[2],
        seconds: rv[3]
    };
}
//The start date/From date. Here i add one hour to offset it. 
//var start = new Date(1814, 3, 20, 1);
//The end date. today, now!
//var end = new Date();
//Get the difference
//var d = timeDiff(start, end);
// Log that bitch
//console.log('years: '+ d.years + '. months: '+ d.months + '. days: ' + d.days + '. hours:' +d.hours+ '. minutes:' + d.minutes + '. seconds: ' + d.seconds);
于 2013-02-04T01:57:52.090 に答える
0

これらのケースも考慮することができます。2 つの日付2nd Mar 2008とを考えます5th Jun 2013

             Mar
2008  ________###########################
2009  ###################################
2010  ###################################
2011  ###################################
2012  ####################################  (leap)
2013  ###############--------------------
                  Jun

その間の年 (つまり、2009 年、2010 年、2011 年、2012 年) を減算できます。ここで 2012 年はうるう年ですが、月ではなく年でカウントされるため問題ありませ

Years = 4

今、あなたはこれで残っています

            2 
Mar 08  ____################################
Apr 08 ####################################
May 08 #####################################
Jun 08 ####################################
Jul 08 #####################################
Aug 08 #####################################
Sep 08 ####################################
Oct 08 #####################################
Nov 08 ####################################
Dec 08 #####################################
Jan 12 #####################################
Feb 12 ###################################
Mar 12 #####################################
Apr 12 ####################################
May 12 #####################################
Jun 12 #########----------------------------
                5

月数だけ数えてみてください。含まれる日数は関係ありません。それらはではなくでカウントされています。

Months = 14

           2 
Mar 08  ____################################
Jun 12  #########----------------------------
                5

ここで、2008 年 3 月と 2012 年 6 月の残りの日数を数えます (終了日を除く)。ここで、カウントは 29(3 月) + 4(6 月) = 33 になります。

Days = 33

しかし、33日は1ヶ月+数日と換算できるので奇妙に思えます。この場合、3 月 (31 日)、6 月 (30 日)、または 30 日を減らして 1 か月を追加するか、どの月を選択するかという問題が生じます。大きな違いを考えると、これはほとんど問題にならないと思います。3月を考えると、違いは

4 Years 15 Months 2 Daysまたは単に5 Years 3 Months 2 Days

同じアプローチをしばらく続けることができます。

編集済み

Let `date1` be greater than `date2`
Let max(month) gives the total days in the month

years = date1.year - date2.year - 1;
months = date1.month - date2.month - 1;
days = (max(date2.month) - date1.day) + (date2.day - 1);
if(days >= 30)       //Here you can take totals days in date1 or date2
{
    month++;
    days-=30;
}
while(month >= 12)      //Here month can reach a value of 24 because it can be incremented above too
{
    years++;
    month-=12;
}
print("Difference is " + years + " years " + month + " months " + days + " days");
于 2012-10-29T12:41:30.947 に答える
-1
var years = currentDate.getYear() - startDate.getYear();
var months = currentDate.getMonth() - startDate.getMonth();
...
于 2012-10-29T12:28:17.190 に答える