• 締切済み

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% (1303/1774)
回答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% (6621/9384)
回答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% (1520/2213)
回答No.1

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

関連するQ&A

  • 日付取得、計算及び表示コードが動作しません。

    日付取得、計算及び表示コードが動作しません。 下記のコードのどこが間違っているのか、どなたかお分かりですか? このコードでは、今日の日付をサーバから取得し、それから10日後の日付を計算して表示したいです。 $currentdate = .getdate(); $yyyy = $currentdate["year"]; $mm = $currentdate["mon"]; $dd = $currentdate["mday"]; $int_day = 10; $duedate = .date("y/m/d", mktime(0, 0, 0, $mm, $dd+$int_day, $yyyy)); echo "$duedate" また、上記のコードが動作するようになったとして、表示される日付は「2008/06/10」のようになるかと思いますが、これを「2008年06月10日」のように表示させる方法をご存知でしょうか? >$duedate = .date("y/m/d", mktime(0, 0, 0, $mm, $dd+$int_day, $yyyy)); 上記コードを下記のように変更してもだめです。 >$duedate = .date("y年m月d日", mktime(0, 0, 0, $mm, $dd+$int_day, $yyyy)); よろしくお願いします。

    • ベストアンサー
    • PHP
  • 条件式の書き方を教えてください。

    unique | day_start | day_end --------+----------------------------+---------------------------- 1 | 2006-06-02 12:49:07.094831 | 2007-01-17 02:00:58.643778 2 | 2006-06-08 12:49:07.122762 | 2007-01-17 02:00:58.647793 3 | 2006-06-08 12:49:07.137901 | 2007-01-17 02:00:58.65177 4 | 2006-06-04 12:49:07.15393 | 2007-01-17 02:00:58.655763 5 | 2006-06-08 12:49:07.181952 | 2007-01-17 02:00:58.65976 6 | 2006-06-08 12:49:07.181952 | 7 | 2006-06-08 12:49:07.181952 | 2007-01-17 02:00:58.65976 上記のようなデータがあるとします。 day_startとday_endの間の日数の平均が知りたいです。 ただし、uniqueが7のレコードのように、 day_endがNULLのレコードもあり、その場合は、そのレコードの日数はday_startから現在日までとしたいです。 select avg(to_date(day_start,'yyyy/mm/dd') - to_date(day_end,'yyyy/mm/dd')) from a ※day_endがNULLのレコードもあり、その場合は、そのレコードの日数はday_startから現在日までとしたいです。 ↑この部分の条件式の書き方が分りません。 ご教示いただけないでしょうか。

  • VB6 日付操作

    Format(Date, "YYYY/MM/DD") を使用して数年前や数日前を取得する方法はありますか?

  • javascriptで質問

    javascript初心者です。 日付で自動的に変わるようなメニューが作りたいのですが もっとシンプルに簡潔にできますか? また、開いているページのタブの色を他と変えたいのですができますか? 以下ソース↓ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=shift_jis"> <title>スクリプトテスト</title> <style type="text/css"> .menu li{ list-style-type:none; float:left; border:solid 1px #666666; } .menu li a{ padding:5px; background:#eeeeee; display:block; } .menu li a:hover{ background:#ffffff; } </style> <script type="text/javascript"> <!-- var day01 = new Date(); var year01 = day01.getFullYear(); //年 var mon01 = day01.getMonth() + 1; //月 var date01 = day01.getDate(); //日 var day02 = new Date(); day02.setDate( day02.getDate()+1 ); var year02 = day02.getFullYear(); //年 var mon02 = day02.getMonth() + 1; //月 var date02 = day02.getDate(); //日 var day03 = new Date(); day03.setDate( day03.getDate()+2 ); var year03 = day03.getFullYear(); //年 var mon03 = day03.getMonth() + 1; //月 var date03 = day03.getDate(); //日 var day04 = new Date(); day04.setDate( day04.getDate()+3 ); var year04 = day04.getFullYear(); //年 var mon04 = day04.getMonth() + 1; //月 var date04 = day04.getDate(); //日 var day05 = new Date(); day05.setDate( day05.getDate()+4 ); var year05 = day05.getFullYear(); //年 var mon05 = day05.getMonth() + 1; //月 var date05 = day05.getDate(); //日 var day06 = new Date(); day06.setDate( day06.getDate()+5 ); var year06 = day06.getFullYear(); //年 var mon06 = day06.getMonth() + 1; //月 var date06 = day06.getDate(); //日 var day07 = new Date(); day07.setDate( day07.getDate()+6 ); var year07 = day07.getFullYear(); //年 var mon07 = day07.getMonth() + 1; //月 var date07 = day07.getDate(); //日 // --> </script> </head> <body> <ul class="menu"> <script type="text/javascript"> <!-- document.write('<li><a href="'+year01+mon01+date01+'.html">'+mon01+'月'+date01+'日'+'</a></li>'); //--> </script> <script type="text/javascript"> <!-- document.write('<li><a href="'+year02+mon02+date02+'.html">'+mon02+'月'+date02+'日'+'</a></li>'); //--> </script> <script type="text/javascript"> <!-- document.write('<li><a href="'+year03+mon03+date03+'.html">'+mon03+'月'+date03+'日'+'</a></li>'); //--> </script> <script type="text/javascript"> <!-- document.write('<li><a href="'+year04+mon04+date04+'.html">'+mon04+'月'+date04+'日'+'</a></li>'); //--> </script> <script type="text/javascript"> <!-- document.write('<li><a href="'+year05+mon05+date05+'.html">'+mon05+'月'+date05+'日'+'</a></li>'); //--> </script> <script type="text/javascript"> <!-- document.write('<li><a href="'+year06+mon06+date06+'.html">'+mon06+'月'+date06+'日'+'</a></li>'); //--> </script> <script type="text/javascript"> <!-- document.write('<li><a href="'+year07+mon07+date07+'.html">'+mon07+'月'+date07+'日'+'</a></li>'); //--> </script> </ul> </body> </html>

  • yyyy/mm/dd(aaa) hh:mm

    http://www9.plala.or.jp/oyoyon/html/script/modified.html を参考にしているのですが、 yyyy/mm/dd(aaa) hh:mm のように、「00時00分」まで表示するにはどうすればいいでしょうか? ----------------------------------------- <script type="text/javascript"> <!-- var day = new Date(document.lastModified); var y = day.getFullYear(); var m = day.getMonth() + 1; var d = day.getDate(); var week = new Array("日", "月", "火", "水", "木", "金", "土"); var w = week[day.getDay()]; if (m < 10) m = "0" + m; // 数値が1~9の時には if (d < 10) d = "0" + d; // 0 を追加してそろえる document.write("更新日時: " + y + "/" + m + "/" + d + " (" + w + ")"); // --> </script> ----------------------------------------- ここまでできたのですが、時間の表示方法がわかりません。 コピペで作ったので、javascriptは理解できていません。 ご教授よろしくお願いします。

  • EXCEL 日付の入力形式

    こんにちは。 日付が、dd/mm/yyyyの形式で入力されたデータをもらいました。 関数を利用したいのでEXCELに日付として認識させたいのですが、 セルの書式設定で設定してもだめなようです。 質問 1)yyyy/mm/ddの形式で入力されていないと日付として認識されないのでしょうか? 2)現在の形式のまま、日付として認識させる方法はありますか? 3)dd/mm/yyyyをyyyy/mm/ddに変換する方法はありますか? 以上、よろしくお願いします。

  • Excel97の日付の書式設定

    現在Excel97で日付入力をしたいのですが、 最終的に演算に使用する日付で yyyy/mm/ddとyyyy/mmどちらでも入力できる書式設定を探しています。 yyyy/mm/ddの指定にするとyyyy/mmと入力してもyyyy/mm/01となってしまいます。 yyyy/mmのセルとdd専用のセルを別に作ると、ddを入力した時に 閏年のエラーチェックなどがかけられないので演算部分(1年後該当日前日の指定等)がうまく働きません。 いい方法がありましたら教えてください。

  • ACCESS日付形式について質問です。

    日付抽出条件を含んだフォームを作成したのですが、午前中までyyyy/mm/ddの形式で入力し、抽出できたのですが、今mm/ddの形式で入力しないと抽出できなくなりました。 変更をした覚えはないのですが・・・ yyyy/mm/ddで抽出できる方法を教えてください。 おねがいします。

  • 誕生日からの日数を表示するJavaScriptに、カンマを入れる方法を

    誕生日からの日数を表示するJavaScriptに、カンマを入れる方法を教えてください。 JavaScriptの初心者で、申し訳ありません。 誕生日からの日数を表示するJavaScriptと3桁の後にカンマを表示させるJavaScriptは、 それぞれ単独で見つけたのですが、関連のさせ方が分かりません。 誕生日からの日数を表示するJavaScriptは、以下のものです。 days の前後に文字表示をさせています。 この中の days を表示する時に、3桁の後にカンマを表示させたいのですが。 人の生きた日々ですので、万の単位までしか表示しません。 82歳で、30,000日くらいになります。 var tday=new Date(); var bday=new Date(1928,5-1,13); var ac="#ffffff"; var mark=""; var days=Math.ceil((tday.getTime()-bday.getTime())/(24*60*60*1000)); days=(days+"").fontcolor(ac); days=days.bold(); mark=mark.fontcolor(ac); document.write(mark+"いきて来た日々:"+days+"日"+mark); 文字列にカンマを入れる以下のJavaScriptも見つけました。 これと上のJavaScriptを関連させることで、誕生日からの日数にカンマを入れられるで しょうか? もし、できるのであれば、関連のさせかたを教えてください。 以下のものではダメなら、他のJavaScriptで目的を達成できるものを、教えてください。 str= value; for (i=0; i < str.length / 3 ; i++) { str= str.replace ( /^([+-]?\d+) (\d\d\d)/, "$1,$2"); } お願いします。

  • 日付型→文字列

    SQLServer2005の環境にて、 日付型の項目(YYYY/MM/DD HH:MM:SS)から日付のみを抽出したい場合、 現在SUBSTRING(CONVERT(VARCHAR,AA),1,10) と変換を行っているのですが、結果が「MM DD YYYY」となってしまいます。 「YYYY/MM/DD」の形式で取得するにはどのようなSQL文にすればよろしいのでしょうか。