うるう年の謎を解決!日にち計算での課題について

このQ&Aのポイント
  • うるう年の謎について教えてください。日にち計算で、半年-1又は一年-1を求める際に問題が発生しています。特定の日付までの結果がおかしくなってしまいます。解決策を教えてください。
  • 日にち計算で半年-1や一年-1を求める際に問題が発生しています。特に、2011年8月31日までの結果がおかしくなってしまいます。解決方法を教えていただけませんか?
  • うるう年に関する問題があります。日にち計算で半年-1や一年-1を求める際に、特定の日付までの結果が間違っています。どのように修正すれば良いでしょうか?
回答を見る
  • ベストアンサー

うるう年の謎教えてください。

日にち計算で、当日から半年-1又は一年-1を求めたい時に 下記の様入力してみましたが、 =DATE(YEAR(A1),MONTH(A1)+6,DAY(A1)-1) 2011/8/29→ 2012.02.28→ 2012.08.28 2011/8/30→ 2012.02.29→ 2012.08.29 2011/8/31→ 2012.03.01→ 2012.08.30 2011/9/1→ 2012.02.29→ 2012.08.31 2011/9/2→ 2012.03.01→ 2012.09.01 2011/08/31ま半年後-1だけ結果がおかしくなってしまいます。 5年先でもおなじ結果です。 解決方法を教えて頂けませんでしょうか? 宜しくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • ShowMeHow
  • ベストアンサー率28% (1424/5027)
回答No.3

詳しく検証していないけど、 =IF(DATE(YEAR(A1),MONTH(A1)+6,DAY(A1)-1) <EDATE(A1,6),DATE(YEAR(A1),MONTH(A1)+6,DAY(A1)-1),EDATE(A1,6)) でどうだろう。 (edateを使うためには、アドインの分析ツールのチェックを入れておく必要があります。)

tennpi
質問者

お礼

ありがとうございますm(_ _)m 出したかった結果が出てきました。 これで設定して置けば何年先でも問題なしです! 助かりました、本当にありがとうございます。

その他の回答 (2)

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.2

「半年後の1日前」というフロー的には全く問題ない結果ですが どういう結果を想定しているのでしょうか? 2011/8/29の半年後=2/29、その一日前=2/28 2011/8/30の半年後=2/30=3/1、その一日前=2/29 2011/8/31の半年後=2/31=3/2、その一日前=3/1 2011/9/1の半年後=3/1、その一日前=2/29 2011/9/2の半年後=3/2、その一日前=3/1

tennpi
質問者

お礼

ありがとうございます。 今表したいのは、 2011/8/29→ 2012.02.28 2011/8/30→ 2012.02.29 2011/8/31→ 2012.03.01→ここの結果を2012.02.29としたい。 2011/9/1→ 2012.02.29 2011/9/2→ 2012.03.01 設定した日にち(365日)に使用出来る関数表示をしたいです。 上記の5日のうちに、結果同じ日が3日あってもよいのですが、8/31と9/1の結果が8/31の方が1日多くなってしまわないようにしたいです。 教えてください。 宜しくお願いします。

  • ShowMeHow
  • ベストアンサー率28% (1424/5027)
回答No.1

行っている計算は、 8/31+6月-1日 =2/31-1日=2/30 =3/2(うるう年以外の場合) =3/1(うるう年の場合) ですね。 8/31とうるう年以外の8/30については、独自に定義する必要があります。 2011/8/31 2012/8/31 2012/8/30 などをどのように計算させたいかをまずきめる必要があるということです。

tennpi
質問者

お礼

ありがとうございます。 質問が明確ではなかったですね。 表したいのは、 2011/8/29→ 2012.02.28 2011/8/30→ 2012.02.29 2011/8/31→ 2012.03.01→ここを2012.02.29にしたい。 2011/9/1→ 2012.02.29 2011/9/2→ 2012.03.01 5行中3行目だけ日にちが逆転してしまってるのを防ぐにはどうすれば良いのかです。 方法を教えて頂けませんでしょうか? 宜しくお願いします。

関連するQ&A

  • Excel VBAで「date」関数を使いたい

    VBAを使用して年月日を入力してます。 セルに表示だけなら Year & "/" & Month… とかでもいいんですが、その日付で計算を行いたいんです。 何日足す、とか。。 それでExcelで使える Date(Year,Month,Day) を思い出したんですが、VBAではエラーになってしまいました。 Application.WorksheetFunction.Date(Year, Month, Day) や Application.Date(Year, Month, Day) もダメでした。 どのようにしたら入力した日付で計算が行えるでしょうか?

  • うるう年判定

    こんにちは。今回も宜しくお願いします<(_ _)> 画面から入力された日付(生年月日)の妥当性をチェックしたいのですが、それにはまずクラス(API)をわかっていなくてはいけないと思い、お試しで作ったものが、私の想像していた通りに動きません。 import java.util.*; public class Test {  public static void main(String[] args) {   int year;   int month;   int day;   GregorianCalendar g = new GregorianCalendar();   year = g.get( Calendar.YEAR );   month = g.get( Calendar.JUNE );   day = g.get( Calendar.DATE );   System.out.println("year = " + year);   System.out.println("month = " + month);   System.out.println("day = " + day);   } } 上記のソースを実行すると、 C:\WINDOWS\デスクトップ\カレンダ>java Test year = 2003 month = 3 day = 3 となります。月の指定はCalendar.JUNEとしているのに、どうして3と表示されるのでしょうか? あともう一つ質問なのですが、GregorianCalendarに自分の好きな年月を与えたいのですが、 g.get( 1980 ); とすると実行時にArrayIndexOutOfBoundsExceptionのエラーがでます。 GregorianCalendarを使って任意の年月を渡すことは無理なんでしょうか? 私が最初考えたのが、画面から入力された値をそのままGregorianCarendarに渡して、もしもその時にエラーがでたらそれは妥当ではなかった値(閏年じゃないのに2月29日と入力したり、とか)として、画面にて再入力を促すメッセージをだそうと思っていたのですが、この考え方はどこか変でしょうか? お手数お掛けいたしますが、宜しくお願い致します<(_ _)>

    • ベストアンサー
    • Java
  • エクセル関数について質問です。

    はじめて投稿します。 エクセルで今日から半年後-1日(と今日から一年-1日)の表示が出来るようにしたいのですが、 どのようにしたら出来ますか? =DATE(YEAR(A1),MONTH(A1)+6-1,DAY(A1-1)) 上記で入力したみましたが、2011/06/01から半年-1は 2011/11/30 となってほしいのに 2011/12/01 となってしまいました。 教えてください。よろしくお願いします。

  • Schemeのプログラミング うるう年関連

    Schemeのプログラミング うるう年関連 Schemeで、 「(1)閏年かどうかを判定する関数leap?(number -> boolean)を定義した後、(2)○年○月の日数は何日かを求める関数num-of-days(number number -> number)を定義せよ」 という内容の課題を出されたのですが、(例えば 2009年の7月→31日 2012年の2月→29日) どうもエラーが出て実行できません。 自分は以下のように組みました。 ;;(1)の関数 (define (leap? year) (cond [(= (remainder year 400) 0) #t] [(and (= (remainder year 4) 0)(> (remainder year 100) 0)) #t] [else #f] ) ) ;;(2)の関数 (define (num-of-days year month) (cond [(and (= month 2)(= (leap? year) #t)) 29] [(and (= month 2)(= (leap? year) #f)) 28] [(or (= month 1)(= month 3)(= month 5) (= month 7)(= month 8)(= month 10) (= month 12)) 31] [else 30] ) ) これを例えば (num-of-days 2008 4) や (num-of-days 1995 12) などとして実行すると、それぞれ30,31という正しい値を返してくれるのですが、 (num-of-days 2008 2) や (num-of-days 1995 2) など、閏年・非閏年に関係無く、2月が絡むと =: expects type <number> as 1st argument, given: false; other arguments were: true というエラーを吐いてしまいます。 何度も見直しましたが、どこが間違っているのか見付けきれません…。どなたか間違いを指摘して頂けると幸いです。

  • 最新受診日から次の受診日を表示する関数(再度)

    前回回答をいただきましたが、また問題があったので質問します。 【次のの条件で次回受診期限日を表示する関数を、どなたか教えていただけますか? 65歳までは受診した日から3年ごとに受診。 65歳に到達した日から1年以内に受診、受診日より75歳に到達するまでは3年ごとに受診。 75歳に到達した日から1年以内に受診、受診日より1年ごとに受診。 受診日(A3)は最新受診日を常に打ち込んで更新するものとします。 年齢(A1)は関数で生年月日より、リアルタイムで表示。 以下のセルの並びで考えていますが、効率のよい方法もあれば教えてください。 タイプ1) 年齢(A1) 生年月日(A2) 受診日(A3) 次回受診期限日(A4) または   タイプ2) 年齢(A1) 生年月日(A2) 受診日(A3) 次回受診期限日(A4) 65歳到達日(A6) 75歳到達日(A7)】 という質問をしました。 前回、の回答で 回答1 タイプ2で対応するのがA3に入力する式を省略できる点でベターでしょう。 A1セルには次の式を入力します。 =DATEDIF(A2,TODAY(),"Y") A4セルには次の式を入力します。 =IF(DATE(YEAR(A3)+3,MONTH(A3),DAY(A3))<=A6,DATE(YEAR(A3)+3,MONTH(A3),DAY(A3)),IF(A3<=A6,DATE(YEAR(A6)+1,MONTH(A6),DAY(A6)),IF(DATE(YEAR(A3)+3,MONTH(A3),DAY(A3))<=A7,DATE(YEAR(A3)+3,MONTH(A3),DAY(A3)),IF(A3<=A7,DATE(YEAR(A7)+1,MONTH(A7),DAY(A7)),DATE(YEAR(A3)+1,MONTH(A3),DAY(A3))))))-1 A6セルには次の式を入力します。 =DATE(YEAR(A2)+65,MONTH(A2),DAY(A2)) A1セルを除いてセルの表示形式は日付にします。 A7セルには次の式を入力します。 =DATE(YEAR(A2)+75,MONTH(A2),DAY(A2)) という回答と 回答2 タイプ1 A1=DATEDIF(A2,TODAY(),"y") A2=生年月日 A3=直近の受信日 A4=(LOOKUP(A1,{0,63,64,65,74},{3,2,1,3,1})+YEAR(A3)&"/"&TEXT(A3,"MM/DD"))-1 タイプ2 A1=DATEDIF(A2,TODAY(),"y") A2=生年月日 A3=直近の受信日 A4=(LOOKUP(A1,{0,63,64,65,74},{3,2,1,3,1})+YEAR(A3)&"/"&TEXT(A3,"MM/DD"))-1 A6=DATE(YEAR(A2)+65,MONTH(A2),DAY(A2)) A7=DATE(YEAR(A2)+75,MONTH(A2),DAY(A2)) という回答をいただきましたが、よくみると 生年月日がS21.9.23だとし、近受診日がH21.7.4の場合 回答1 だと 受診期限がH22.7.3 となり 回答2 だと 受診期限がH24.9.22 になります。 実際は、受診して3年後がH24.7.3であり、65歳に到達するのがH23.9.23である為、 H24.9.22が受診期限だと65歳到達から1年以内だが、3年を過ぎてしまいます。 受診期限がH24.7.3となればよいのですが・・・・・ 複雑なので難しいのでしょうか?

  • ファイルメーカーのスクリプトで25日締めの請求データを作成していますが・・・

    毎度お世話になります。 ファイルメーカーVer4.0 OS=Win2000です。 毎月25日で締めて請求書を起こすために、締め日の翌日(26日)から締め日までのデータを検索して表示するスクリプトを作成しております。 「計算結果を貼り付け」で現在の日付から、表示させる締め日を貼り付けて、検索させようとしております。 見づらくて申し訳ございませんが、本日の日付を拾ったあと、下記の計算をさせようとしていますが、「関数のカンマの数が多すぎます」とエラーが出て困っています。 if(Month ( 本日 )=1, if(Day ( 本日 ) < 26, Year ( 本日 )-1 & "/" & Month ( 本日 )-2 &"/" & 26 & "..." & Year( 本日 )-1 & "/" & Month ( 本日 )-1 &"/" &25, Year ( 本日 )-1 & "/" & Month ( 本日 )-1 &"/" & 26 & "..." & Year( 本日 ) & "/" & Month ( 本日 ) &"/" &25, if(Month ( 本日 )=2, if(Day ( 本日 ) < 26, Year ( 本日 )-1 & "/" & Month ( 本日 )-2 & "/" & 26 & "..." & Year ( 本日 ) & "/" & Month ( 本日 )-1 & "/" & 25, Year ( 本日 ) & "/" & Month ( 本日 )-1 & "/" & 26 & "..." & Year ( 本日 ) & "/" & Month ( 本日 ) & "/" & 25, if(Day ( 本日 ) < 26, Year ( 本日 ) & "/" & Month ( 本日 )-2 & "/" & 26 & "..." & Year ( 本日 ) & "/" & Month ( 本日 )-1 & "/" & 25, Year ( 本日 ) & "/" & Month ( 本日 )-1 & "/" & 26 & "..." & Year ( 本日 ) & "/" & Month ( 本日 ) & "/" & 25))))) ※(本日)とはフィールド名で、スクリプトの最初に「現在の日付を貼り付ける」を入れてありますので、スクリプト起動時に当日の日付が入力されます。 要は、当日が25日までであれば、1月は前年の11月26~12月25日を表示し、 2月は前年の12月26~翌年の1月25日を表示し、3月から12月までは、当日が25日までは、前々月の26日~前月の25日迄を表示し、26日~末日までは前月の26日~当月の25日を表示させて、それを作業日のフィールドに貼り付けて検索すれば、直近の25日締めで表示されると考えました。 どこが違うのでしょうか?

  • Excel VBA 入力規則

    Excel VBAで、下記の様なコードを見ましたが、IgnoreBlank の意味がよく分かりません。 入力規則の「空白云々」のことだと思いますが、よろしくお願いします。 Sub setKiValidation() Dim d As Date ld = DateSerial(Year(Range("$A$1")), Month(Range("$A$1")) + 1, 0) With Range("休日").Validation .Delete .Add Type:=xlValidateWholeNumber, AlertStyle:=xlValidAlertStop, _ Operator:=xlBetween, Formula1:="1", Formula2:= _ "=DAY(DATE(YEAR($A$1),MONTH($A$1)+1,0))" .IgnoreBlank = True .InCellDropdown = True .InputTitle = Month(ld) & "月 休日" .ErrorTitle = Month(ld) & "月 休日" .InputMessage = "数値(1~" & Day(ld) & ") を入力してください" .ErrorMessage = "数値(1~" & Day(ld) & ") を入力してください" .IMEMode = xlIMEModeOff .ShowInput = True .ShowError = True End With ' =SUM(IF(B19:B22<>"",1/COUNTIF(休日,B19:B22),)) ' =AND(0<COUNTIF(休日,DAY(A3)),MONTH(A3)=MONTH($A$1))

  • 【Excel2000】土・日曜日を考慮した日付+α

    現在セルB1には『A1に入力した日の月末日付+月末休日の場合は前日』が出るようにしてあります。 セルA1 = 日付 セルB1 = IF(WEEKDAY(DATE(YEAR(A1),MONTH(A1)+1,0))=1,(DATE(YEAR(A1),MONTH(A1)+1,0))-2,IF(WEEKDAY(DATE(YEAR(A1),MONTH(A1)+1,0))=7,(DATE(YEAR(A1),MONTH(A1)+1,0))-1,DATE(YEAR(A1),MONTH(A1)+1,0))) ここに『A1が25日以降の場合は翌月20日+翌月20日が休日の場合は後日』という設定を加えたいのですが、可能でしょうか?  ・A1 = 2011/07/10 → (結果) B1 = 2011/07/29(金)  ・A1 = 2011/07/25 → (結果) B1 = 2011/08/22(月) どうしても不可能であれば別セル(C1など)でも構いません。

  • EXCELでの契約書の更新管理について

    お世話になります。 EXCEL2002で契約書の更新管理をしています。 例えば、1997年11月12日契約開始、契約期間5年、更新期間3ヵ年自動更新の場合は、 O2:契約開始日 1997/11/12 P2:契約期間  5 Q2:更新期間  3 と入力し、 R2に初回更新日として計算式1(下記参照)を S2に次回更新日として計算式2(下記参照)を を入力しておりますが、上記の例のように入力すると、S2の次回更新日は 2005/11/11 のままで更新されません。 本日から見て次回の更新日がわかるようにするのは、計算式はどうすればいいのでしょうか? お手数ですがよろしくお願いいたします。 ※計算式1:=DATE(YEAR(O2)+P2,MONTH(O2),DAY(O2)-(DAY(1))) ※計算式2:=IF(TODAY()<R2,R2,DATE(YEAR(R2)+SUM(Q2,Q2*INT(DATEDIF(R2,TODAY(),"Y")/R2)),MONTH(R2),DAY(R2)))

  • 日付の比較について

    最近PHPの勉強を始めた初心者です。 はじめて質問させていただきます。 2005-1-1から2020-12-31の間で入力した日付の曜日を表示するプログラムを作成しています。 2005-1-1から2020-12-31の間以外ならエラー表示するようにしたいのですが、 入力した日付との比較がうまくいかず、思うように動きません。 どのように直せばいいのかを教えていただけないでしょうか?よろしくお願いします。 <?php $year=$_POST["year"]; $month=$_POST["month"]; $day=$_POST["day"]; $date_str="$year-$month-$day"; $date_time=strtotime($date_str); $firstdate_str="2005-1-1"; $firstdate_time=strtotime($firstdate_str); $lastdate_str="2020-12-31"; $lastdate_time=strtotime($lastdate_str); if ($date_time < $firstdate_time || $date_time> $lastdate_time)  {  echo "Please enter a date between 1/1/2005 and 12/31/2020.";  } else  {  $finddate=date('l', mktime(0,0,0,$month, $day, $year));  echo "The day entered in on $finddate";  } ?>

    • 締切済み
    • PHP