計算方法と根拠
通知日の求め方
有効期限の日付を、1970年1月1日からの通し日数に直し、通知までの日数を引いて、また年月日に戻します。うるう年や月・年またぎも暦どおりに数えます。
実在しない日付
2月30日のように実在しない日付を入れると、計算を止めてお知らせします。
計算例
有効期限が2027年3月31日で、30日前なら2027年3月1日、90日前なら2026年12月31日です。
使っている式
| 名前 | やっていること | 式 |
|---|---|---|
| 月が1〜2月か(1=はい) | 日付を通し日数に直す計算で、1・2月を前年の続きとして扱うための判定です。 | sa = if(em <= 2, 1, 0) |
| 調整した年 | 1・2月は前年として数えた年です。 | sy = ey - sa |
| 400年周期の番号 | グレゴリオ暦は400年で同じ並びに戻ります。 | se = floor(sy / 400) |
| 400年周期内の年 | 調整した年から400年周期の分を引いた値です。 | so = sy - se * 400 |
| 3月起点の月 | 3月を0、翌年2月を11とした月の番号です。 | sm = if(em > 2, em - 3, em + 9) |
| 3月1日からの日数 | 3月1日を0とした、その年の中の日数です。 | sd = floor((153 * sm + 2) / 5) + ed - 1 |
| 400年周期内の通し日数 | うるう年を数えながら通し日数にします。 | sdo = so * 365 + floor(so / 4) - floor(so / 100) + sd |
| 有効期限の通し日数(1970-01-01=0) | 1970年1月1日を0とした有効期限の通し日数です。 | ser = se * 146097 + sdo - 719468 |
| 有効期限の戻し確認(z0) | 通し日数を日付に戻して、入力が実在する日付か確かめる途中計算です。 | z0 = ser |
| 有効期限の戻し確認(zp0) | 通し日数を日付に戻して、入力が実在する日付か確かめる途中計算です。 | zp0 = z0 + 719468 |
| 有効期限の戻し確認(er0) | 通し日数を日付に戻して、入力が実在する日付か確かめる途中計算です。 | er0 = floor(zp0 / 146097) |
| 有効期限の戻し確認(de0) | 通し日数を日付に戻して、入力が実在する日付か確かめる途中計算です。 | de0 = zp0 - er0 * 146097 |
| 有効期限の戻し確認(ye0) | 通し日数を日付に戻して、入力が実在する日付か確かめる途中計算です。 | ye0 = floor((de0 - floor(de0 / 1460) + floor(de0 / 36524) - floor(de0 / 146096)) / 365) |
| 有効期限の戻し確認(dy0) | 通し日数を日付に戻して、入力が実在する日付か確かめる途中計算です。 | dy0 = de0 - (365 * ye0 + floor(ye0 / 4) - floor(ye0 / 100)) |
| 有効期限の戻し確認(q0) | 通し日数を日付に戻して、入力が実在する日付か確かめる途中計算です。 | q0 = floor((5 * dy0 + 2) / 153) |
| 有効期限の戻し確認(day0) | 通し日数を日付に戻して、入力が実在する日付か確かめる途中計算です。 | day0 = dy0 - floor((153 * q0 + 2) / 5) + 1 |
| 有効期限の戻し確認(mon0) | 通し日数を日付に戻して、入力が実在する日付か確かめる途中計算です。 | mon0 = if(q0 < 10, q0 + 3, q0 - 9) |
| 有効期限の戻し確認(yr0) | 通し日数を日付に戻して、入力が実在する日付か確かめる途中計算です。 | yr0 = ye0 + er0 * 400 + if(mon0 <= 2, 1, 0) |
| 入力した日付が実在するか(1=実在) | 通し日数から日付に戻した結果が入力と同じなら実在する日付です。 | valid = if(yr0 == ey && mon0 == em && day0 == ed, 1, 0) |
| 入力した日付が実在するか(実在しない日付は計算できません) | 2月30日のように実在しない日付だと計算を止めます。 | guard = 1 / valid |
| 1回目の通知日の途中計算(z1) | 有効期限から1回目の通知の日数を引いた通し日数を、年月日に戻す途中計算です。 | z1 = ser - l1 |
| 1回目の通知日の途中計算(zp1) | 有効期限から1回目の通知の日数を引いた通し日数を、年月日に戻す途中計算です。 | zp1 = z1 + 719468 |
| 1回目の通知日の途中計算(er1) | 有効期限から1回目の通知の日数を引いた通し日数を、年月日に戻す途中計算です。 | er1 = floor(zp1 / 146097) |
| 1回目の通知日の途中計算(de1) | 有効期限から1回目の通知の日数を引いた通し日数を、年月日に戻す途中計算です。 | de1 = zp1 - er1 * 146097 |
| 1回目の通知日の途中計算(ye1) | 有効期限から1回目の通知の日数を引いた通し日数を、年月日に戻す途中計算です。 | ye1 = floor((de1 - floor(de1 / 1460) + floor(de1 / 36524) - floor(de1 / 146096)) / 365) |
| 1回目の通知日の途中計算(dy1) | 有効期限から1回目の通知の日数を引いた通し日数を、年月日に戻す途中計算です。 | dy1 = de1 - (365 * ye1 + floor(ye1 / 4) - floor(ye1 / 100)) |
| 1回目の通知日の途中計算(q1) | 有効期限から1回目の通知の日数を引いた通し日数を、年月日に戻す途中計算です。 | q1 = floor((5 * dy1 + 2) / 153) |
| 1回目の通知日の途中計算(day1) | 有効期限から1回目の通知の日数を引いた通し日数を、年月日に戻す途中計算です。 | day1 = dy1 - floor((153 * q1 + 2) / 5) + 1 |
| 1回目の通知日の途中計算(mon1) | 有効期限から1回目の通知の日数を引いた通し日数を、年月日に戻す途中計算です。 | mon1 = if(q1 < 10, q1 + 3, q1 - 9) |
| 1回目の通知日の途中計算(yr1) | 有効期限から1回目の通知の日数を引いた通し日数を、年月日に戻す途中計算です。 | yr1 = ye1 + er1 * 400 + if(mon1 <= 2, 1, 0) |
| 2回目の通知日の途中計算(z2) | 有効期限から2回目の通知の日数を引いた通し日数を、年月日に戻す途中計算です。 | z2 = ser - l2 |
| 2回目の通知日の途中計算(zp2) | 有効期限から2回目の通知の日数を引いた通し日数を、年月日に戻す途中計算です。 | zp2 = z2 + 719468 |
| 2回目の通知日の途中計算(er2) | 有効期限から2回目の通知の日数を引いた通し日数を、年月日に戻す途中計算です。 | er2 = floor(zp2 / 146097) |
| 2回目の通知日の途中計算(de2) | 有効期限から2回目の通知の日数を引いた通し日数を、年月日に戻す途中計算です。 | de2 = zp2 - er2 * 146097 |
| 2回目の通知日の途中計算(ye2) | 有効期限から2回目の通知の日数を引いた通し日数を、年月日に戻す途中計算です。 | ye2 = floor((de2 - floor(de2 / 1460) + floor(de2 / 36524) - floor(de2 / 146096)) / 365) |
| 2回目の通知日の途中計算(dy2) | 有効期限から2回目の通知の日数を引いた通し日数を、年月日に戻す途中計算です。 | dy2 = de2 - (365 * ye2 + floor(ye2 / 4) - floor(ye2 / 100)) |
| 2回目の通知日の途中計算(q2) | 有効期限から2回目の通知の日数を引いた通し日数を、年月日に戻す途中計算です。 | q2 = floor((5 * dy2 + 2) / 153) |
| 2回目の通知日の途中計算(day2) | 有効期限から2回目の通知の日数を引いた通し日数を、年月日に戻す途中計算です。 | day2 = dy2 - floor((153 * q2 + 2) / 5) + 1 |
| 2回目の通知日の途中計算(mon2) | 有効期限から2回目の通知の日数を引いた通し日数を、年月日に戻す途中計算です。 | mon2 = if(q2 < 10, q2 + 3, q2 - 9) |
| 2回目の通知日の途中計算(yr2) | 有効期限から2回目の通知の日数を引いた通し日数を、年月日に戻す途中計算です。 | yr2 = ye2 + er2 * 400 + if(mon2 <= 2, 1, 0) |
| 3回目の通知日の途中計算(z3) | 有効期限から3回目の通知の日数を引いた通し日数を、年月日に戻す途中計算です。 | z3 = ser - l3 |
| 3回目の通知日の途中計算(zp3) | 有効期限から3回目の通知の日数を引いた通し日数を、年月日に戻す途中計算です。 | zp3 = z3 + 719468 |
| 3回目の通知日の途中計算(er3) | 有効期限から3回目の通知の日数を引いた通し日数を、年月日に戻す途中計算です。 | er3 = floor(zp3 / 146097) |
| 3回目の通知日の途中計算(de3) | 有効期限から3回目の通知の日数を引いた通し日数を、年月日に戻す途中計算です。 | de3 = zp3 - er3 * 146097 |
| 3回目の通知日の途中計算(ye3) | 有効期限から3回目の通知の日数を引いた通し日数を、年月日に戻す途中計算です。 | ye3 = floor((de3 - floor(de3 / 1460) + floor(de3 / 36524) - floor(de3 / 146096)) / 365) |
| 3回目の通知日の途中計算(dy3) | 有効期限から3回目の通知の日数を引いた通し日数を、年月日に戻す途中計算です。 | dy3 = de3 - (365 * ye3 + floor(ye3 / 4) - floor(ye3 / 100)) |
| 3回目の通知日の途中計算(q3) | 有効期限から3回目の通知の日数を引いた通し日数を、年月日に戻す途中計算です。 | q3 = floor((5 * dy3 + 2) / 153) |
| 3回目の通知日の途中計算(day3) | 有効期限から3回目の通知の日数を引いた通し日数を、年月日に戻す途中計算です。 | day3 = dy3 - floor((153 * q3 + 2) / 5) + 1 |
| 3回目の通知日の途中計算(mon3) | 有効期限から3回目の通知の日数を引いた通し日数を、年月日に戻す途中計算です。 | mon3 = if(q3 < 10, q3 + 3, q3 - 9) |
| 3回目の通知日の途中計算(yr3) | 有効期限から3回目の通知の日数を引いた通し日数を、年月日に戻す途中計算です。 | yr3 = ye3 + er3 * 400 + if(mon3 <= 2, 1, 0) |
| 1回目の通知日の年(結果) | 有効期限日からN日さかのぼった日の年です。 | yr1 |
| 1回目の通知日の月(結果) | 通知日の月です。 | mon1 |
| 1回目の通知日の日(結果) | 通知日の日です。 | day1 |
| 2回目の通知日の年(結果) | 有効期限日からN日さかのぼった日の年です。 | yr2 |
| 2回目の通知日の月(結果) | 通知日の月です。 | mon2 |
| 2回目の通知日の日(結果) | 通知日の日です。 | day2 |
| 3回目の通知日の年(結果) | 有効期限日からN日さかのぼった日の年です。 | yr3 |
| 3回目の通知日の月(結果) | 通知日の月です。 | mon3 |
| 3回目の通知日の日(結果) | 通知日の日です。 | day3 |
式の記法: + - * / ^(べき乗)、かっこ、min / max / round / ceil / floor / pow / abs / sqrt、if(条件, 真のとき, 偽のとき)。round(x, 桁) は四捨五入、ceil は切り上げ、floor は切り捨てです。
設定値(定数)と出典
この計算では、税率や料金表などの外部の設定値は使っていません。数学的な定義の式だけで計算しています。
入力できる範囲
| 項目 | 範囲 | 初期値 |
|---|---|---|
| 有効期限の年 | 2,000〜2,100年 | 2,027年 |
| 有効期限の月 | 1〜12月 | 3月 |
| 有効期限の日 | 1〜31日 | 31日 |
| 1回目の通知(期限の何日前) | 0〜1,000日前 | 90日前 |
| 2回目の通知(期限の何日前) | 0〜1,000日前 | 30日前 |
| 3回目の通知(期限の何日前) | 0〜1,000日前 | 14日前 |
結果は、同じ条件なら本サイトのどのページでも同じ数字になります(ページの数字も、計算ツールも同じ計算の仕組みで出しています)。
ご利用にあたって
- 日付の足し引きだけを行います。証明書の有効期間の上限、更新に必要な日数、休日や営業日は考慮していません。
- 通知までの日数は入力した値で、推奨値ではありません。実際の運用では、認証局や社内の手順を確認してください。