- ベストアンサー
ある日付から○年○月○日目の計算
ウェブログを始めました。 記事の隣に配置されているメニューカラムとでも申しましょうか。 そこに、自分の好きなカテゴリーを設置できると最近知りました。 そこで、「2014年3月28日から、今日で○年○月○日」と表示させるようにしたいです。 現在、「○日」という表示は出来るようになったのですが(サンプルをこぴぺで…) 未来、桁数がすさまじいことになっていくので、年月日にしたいのですが 知識がないので、どなたか、例文をご存じでしたら教えて下さい。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
ちなみに#4例で、0年1月-1日後でよければ以下 <script> var startDay = new Date(2014,0,31);// 1月31日 var endDay = new Date(2015,2,2);// 3月2日 function ddiff(s,e){ if(s > e) return false; var y1=s.getFullYear(),m1=s.getMonth(),d1=s.getDate(); var y2=e.getFullYear(),m2=e.getMonth(),d2=e.getDate(); var y0=y2-y1,m0=m2-m1,d0=d2-d1; y0-=(m1>m2 || (m1==m2 && d1>d2))?1:0; m0=(12+m0-(d1>d2?1:0))%12; d0+=d1>d2?(new Date(y2,m2,0)).getDate():0; return y0+"/"+m0+"/"+d0; } document.write(ddiff(startDay,endDay)); </script>
その他の回答 (4)
- yambejp
- ベストアンサー率51% (3827/7415)
○年○月○日後というものをどう定義するか指示してもらえれば 実現はできるでしょう(それが正しいかどうかは別として) たとえば2/28までだとして3/2は1/31の何年何月何日後ですか?
お礼
2016年なら3日後です。 と、お返事しておりませんでした。 もうしわけありませんでした。。。
- fujillin
- ベストアンサー率61% (1594/2576)
日数の差などは簡単に求められますが、他の回答者様がお答えのように、月の大小やうるう年などを考慮しなければならず、差の日数だけから換算しようとすると難しいですね。 年や月(必ず12ヶ月なので12進法)はあまり問題はないので、日の計算をどのように考えるかということになりそうです。 何が正しいというのはなさそうですが、まぁ、翌月の同じ日までを1ヶ月とするような考え方にすれば、違和感は少ないのではないかと思います。 ただし、例えば同じ15日であっても、何月の15日かによって日数が変わってしまいます。 要は、前月の日数に依存してしまうので、例えば基準日が16日の場合、〇ヶ月30日(前月が31日ある)となったり、△ヶ月29日(前月が30日まで)となったりします。 そんな考え方で良ければ・・・ A(年A,月A,日A) - B(年B,月B,日B) をそれぞれ筆算的に日→月→年の順に計算してゆけばよいのではないでしょうか。 それぞれで負数になる場合は、上位の桁から繰り下げて計算することになりますが、例えば、日の計算で負数になった場合は、Bの日付を1ヶ月前にして(setMonth()でできます)その1ヶ月分の日数を加算し、それ以後の計算(月、年)は繰り下げた日付を基に計算する・・といった要領でよさそうです。 月の計算の場合は月数が固定なので、負数になったら単に12を加算して年を繰り下げという普通の計算ですみますね。
お礼
>同じ15日であっても、何月の15日かによって日数が変わってしまいます 同じ15日なら、28日だろうが31日だろうが、0年1月1日で良いです。 たとえば、自分の誕生日の場合。 1月1日に産まれて、うるう年があろうが、28日の月があろうが、31日までの月を過ごそうが、 30年後の1月1日は、30年0月0日目と考えますよね。 厳密に何日目なのかは、現在使っているカウントアップで良いです。
- yambejp
- ベストアンサー率51% (3827/7415)
>DATEDIF(A1,B1,"Y") & "年"& DATEDIF(A1,B1,"YM") & "月"& DATEDIF(A1,B1,"MD") 上記例だとたとえばA1に2014/1/31、B1に14/3/1といれてみてください いかにおかしいかがわかると思います 月をまたぐときはどうするか、小の月があるときはどうするか うるう年の2月をどうするかなど きちんと場合分けを考えればできないことはないと思います
お礼
本当だ、どうしてそうなるのか分かりませんがおかしいですね。 面白い現象を見ました。 自分は特にパソコンでOfficeのソフトを使うような仕事をしていないのですが、そのうち何故なのか調べてみたいです。 で、今教えて頂きたいのはJavascrptなのですが、どうでしょうか。 ネットで転がっていたサンプルがあったのですが、そちらをこぴぺしたらちょっと日にちがずれました。 やっぱり難しいということでしょうか。
- FEX2053
- ベストアンサー率37% (7991/21371)
これ、Excelでも困った問題になるんですが・・・。 1か月は28日だったり、31日だったり、1年も366日だったりしますよね。 なので、たとえば開始から31日目は31日目なのか、1か月と1日目なのか、 それこそ1か月と3日目なのか判らないんです。 その辺をどう決めるかって話で、単純に1カ月は30日、1年は360日と 割り切るなら、割れば済む話なんですけどね。後はそれでいいかという 「考え方」の問題になります。
お礼
Excelは「セル」を持っています。セルがあれば結構何でも出来ますよ。 関数も豊富ですし、そもそも日付の概念もしっかり持って単純に足し算と引き算も出来ますから普段の使い方してれば怖いものないです。 A1が開始日、B1がtodayだったとしますね。 DATEDIF(A1,B1,"Y") & "年"& DATEDIF(A1,B1,"YM") & "月"& DATEDIF(A1,B1,"MD") 簡単でしょ? Javaとかそういうプログラミング系は素人なんで教えて下さい。
お礼
丸投げなのにどうもありがとうございます! 早速試してみたところ、理想の結果になりました! しかしながら、ブログ自体毎日更新しないのに、endDayを毎日手作業で変えるのは自分にはとても出来ません。 endDayへは、固定値ではなく本日日付を取得させたいです。 自分なりに調べてみて、new Date()にしたら、1か月ずれました。 何か、ずれるのは仕様っぽいことが書いてあったので、開始日(本当は3月28日)を、2月28日にしました。 本日(12月22日)時点で、0年8か月25日と表示されて欲しいのですが、1日ずれて0年8か月24日と表示されています。 日も、月と同じように1日ずれるものなんでしょうか? (そういう記述は、見つけられませんでした) もしそうだとしたら、開始日を2月27日にすれば良いのでしょうか。 現在、こうなっています。 (開始日の固定日、終了日、document.writeを"○/○/○"から"(○年○か月○日)”と表示させるようにしたの3点しか変えていません。) <script type="text/javascript"> var startDay = new Date(2014,2,27); var endDay = new Date(); function ddiff(s,e){ if(s > e) return false; var y1=s.getFullYear(),m1=s.getMonth(),d1=s.getDate(); var y2=e.getFullYear(),m2=e.getMonth(),d2=e.getDate(); var y0=y2-y1,m0=m2-m1,d0=d2-d1; y0-=(m1>m2 || (m1==m2 && d1>d2))?1:0; m0=(12+m0-(d1>d2?1:0))%12; d0+=d1>d2?(new Date(y2,m2,0)).getDate():0; return "("+y0+"年"+m0+"か月"+d0+"日)"; } document.write(ddiff(startDay,endDay)); </script> 肝心のプログラミングの中身は全く理解出来ていない訳ですが、 とりあえず今は、やりたかった事が出来ています。 これを機にちょっとデキるようになりたいなーとか思ったけど、難しすぎでした。