• 締切済み

JavaScriptで日付の差分を求める方法

var day1 = new Date("2022/10/14"); var day2 = new Date("2020/06/23"); var termDay = (day2 - day1) / 86400000; これで、日数の差分が求められるんですが、それを「yyyy/mm/dd」にする方法を教えてくください。

みんなの回答

  • fji-jp
  • ベストアンサー率84% (11/13)
回答No.5

直感的な見た目での日付の差分にする方法として、下記にシンプルなコード作成してみました。 方法の一つとして参考になればと思います。 //day1<day2となるように入れ替え [day1, day2] = (day2 < day1) ? [day2, day1] : [day1, day2]; //単純に年、月、日の差を求める var y = day2.getFullYear() - day1.getFullYear(); var m = day2.getMonth() - day1.getMonth(); var d = day2.getDate() - day1.getDate(); //日がマイナスの場合は、求めた月を繰り下げて、日付のみの差を求め直す。 //月がマイナスの場合は、求めた年を繰り下げて、12ヶ月足す if (d < 0) m--, d = ((new Date(day1.getFullYear(), day1.getMonth()+1, day2.getDate())) - day1) / 86400000; if (m < 0) y--, m += 12; //0埋めした年/月/日の差分表示形式を生成 var ymd = ("000"+y).slice(-4) + "/" + ("0"+m).slice(-2) + "/" + ("0" + d).slice(-2); //結果を表示 console.log(ymd);

回答No.4

function A (date0 = new Date, date1 = new Date) { const getDtVals = (d, o=[])=> ['FullYear','Month','Date', 'Hours','Minutes','Seconds','Milliseconds'].map ((f,i)=> d['get'+f]()+(o[i]||0)); let counts = [], current = new Date (date0); for (let i = 0; i < 7; i++) { let vs = getDtVals (current), loop = true, dt; counts[i] = 0; while (loop) { vs[i] += 1; dt = new Date (...vs); if (loop = dt <= date1) { counts[i] += 1; current = dt; } } } return counts; } function B (a,b) { return a < b ? A (a, b): A (b, a); } function C (ary, n = 3) { const strs = ['年','月','日','時','分','秒','ミリ秒']; return [...Array (n)].map ((_,i)=> ary[i]+strs[i]).join ``; } //_________________ console.log (C(B(new Date (2022,0,1, 10, 12, 14, 111), new Date (2023,2,4, 14, 17,20,118)), 7)); console.log (C(B(new Date (2022,0,1, 10, 12, 14, 111), new Date (2023,2,4, 14, 17,20,118)))); きっと以下を求めているのでしょうけれど!? function D (dt = new Date, offset = [0,1]) { return ['FullYear','Month','Date'].map ((f,i)=> dt['get'+f]()+(offset[i]||0)).join `/`; } console.log (D(new Date));

  • 4017B
  • ベストアンサー率73% (1341/1821)
回答No.3

関数化するのが面倒でしたので、力技というか単純に計算結果を変数にブチ込んで表示させるだけならば… //---------- var sdate = termDay = 72835200000; //m秒数 var snum_y = 31536000000, snum_m = 2592000000, snum_d = 86400000; var tmp_y = sdate % snum_y, tmp_m = tmp_y % snum_m, tmp_d = tmp_m % snum_d; var re_y = Math.trunc(sdate / snum_y), re_m = Math.trunc(tmp_y / snum_m), re_d = Math.trunc(tmp_m / snum_d); var re = 'およそ '+ re_y +'年と'+ re_m +'ヶ月'+ re_d +'日 です。'; console.log( re ); -----------// ~とりあえずこんな感じで、それっぽいモノが表示されるかと。尚、計算式は単純化していますので、うるう年等は一切考慮されません。あくまでもおおよその概算を表示するものと割り切ってください。 P.S. 何かボロクソな言われ様ですが(笑)。要するに「結果をマシンライクな秒数表示などでは無く、人間味あふれる年月日式で表示したい」という事ではないかと推理してみましたが…もしも見当違いでしたらご容赦ください。

  • asciiz
  • ベストアンサー率70% (6850/9746)
回答No.2

>それを「yyyy/mm/dd」にする方法を教えてくください。 変換すること自体を考え直しましょう。 「日付」同士の差分は「時間」であって、「日付」にはなりません。 例えば、「1月5日」から「1月1日」を引くと、「4日間」という時間になります。 この「4日間」という結果は、「1月4日」などではありません。 ---- また別の話をすると、例えば「1か月と5日後」というのは、開始日によって結果が違います。 1月1日から「1か月と5日後」は2月6日で、日数にすると36日後です。 2月1日から「1か月と5日後」は3月6日で、日数にすると33日後、または34日後(閏年の場合)です。 1か月の長さが月によって違うから、人の世界で言う「何ヶ月後」「何年後」というのは、コンピュータにとってはとても扱いづらい物なんです。 ですから、JavaScriptプログラミングの世界では、日時は全て「1970年1月1日 0:00 を起点とする経過秒数」としてのみ、扱っています。 ある日付値(シリアル値)が、実際の何年何月何日・何曜日に相当するかは、ライブラリの方で変換表示することにして、日付値自体は年月日を持たず、ただ1つの値であるのです。

  • _kappe_
  • ベストアンサー率68% (1601/2329)
回答No.1

「day2はday1の×年×か月×日後」というような結果を得たいということでしょうか。これは簡単な話ではありません。 同じ年の1月26日から2月28日の期間は33日で、別の言い方だと1か月と2日になります。 では、同じ年の2月26日から3月28日だとどうなるか。こちらも1か月と2日ですが、日数は年によって30日だったり31日だったりします。 つまり、日数の差分から「×年×か月×日後」という表現を導くことはできず、各月の日数を意識しながら計算することになります。長くなりそうなのでプログラムは書きません。

関連するQ&A