・勤続年数
特に定めのない計算の場合、端数処理には裁量がある。
年の期間を求める場合、一般的には一年未満の端数を切上げ(1年+1日でも2年)とすることが多く、同じように月の期間を求める場合は、1ヶ月未満の日の端数も切上げて1ヶ月とすることが多い。
https://www.nta.go.jp/taxes/shiraberu/taxanswer/shotoku/1420.htm
ただ、日の端数を切上げたことにより1年を超えてしまい2年になるというような考え方はせず「1年未満の端数は1年に切上げる」だけと考えることが普通。
月の部分については、切上げ(1日でも所属したら1ヶ月とする)以外にも、日付を無視する計算方法もある。
イメージとして切上げは開始月を月初に、終了月を月末にしていて、日付無視は開始月と終了月を同じ日にしていると考えると分かりやすい。
・年齢
年齢の何ヶ月の部分は月末をどうするかが難しい。シンプルなのは先ず、
経過月 = 終了月-開始月
で経過月を算出し、
終了月の日 = 月末 OR 開始月の日 <= 終了月の日
満たさない場合、経過月-1月
という計算式。あるいは、
終了月の日 != 月末 AND 開始月の日 > 終了月の日
満たす場合、経過月-1月
開始月の日 <= 終了月の日
という部分は普通の考え方で、
終了月の日 = 月末
という部分は、開始月、終了月が月末の場合、1/31~2/28など最初の条件を満たさなくても、1ヶ月プラスされる部分があり、この場合、開始月側は何日であっても問題ないので終了月側だけ月末かどうか判断している。
ただ、月末同士で1ヶ月と考える方が自然ではあるけど、当然、
7/31-8/30で1ヶ月判定なし
8/31-9/30で1ヶ月判定あり
というよう結果もあるので少し気持ち悪さも残る。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 |
using System; using System.Windows.Forms; namespace WindowsFormsApp1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); textBox1.LostFocus += DateParse; textBox2.LostFocus += DateParse; } private void DateParse(object sender, EventArgs e) { TextBox textBox = (TextBox)sender; try { textBox.Text = DateTime.Parse(textBox.Text).ToString("yyyy/MM/dd"); } catch { textBox.Text = ""; } GetDuration(); } private void GetDuration() { if (textBox1.Text == "" || textBox2.Text == "") return; var startDate = DateTime.Parse(textBox1.Text); var endDate = DateTime.Parse(textBox2.Text); if (startDate > endDate) return; int y = endDate.Year - startDate.Year; int m = endDate.Month - startDate.Month; if (startDate.Month > endDate.Month) { y = y - 1; m = 12 + m; // mはマイナスの値が入っている } // 勤続年数(切上げ) -------------------------------------------------------- int yy = y; int mm = m + 1; if (mm == 12) // mmは最大でもm=11で+1され12まで { yy = y + 1; mm = 0; } textBox3.Text = yy.ToString() + "年" + mm.ToString() + "ヶ月"; // 勤続年数(切下げ) -------------------------------------------------------- textBox4.Text = y.ToString() + "年" + m.ToString() + "ヶ月"; // 年齢 -------------------------------------------------------- bool isLastDay = false; if (endDate.Month != endDate.AddDays(1).Month) isLastDay = true; // 月末かどうか int yyy = y; int mmm = m; if (startDate.Day > endDate.Day && !isLastDay) mmm = m - 1; if (mmm == -1) // mmmは最低でもm=0で-1され-1まで { yyy = y - 1; mmm = 11; } textBox5.Text = yyy.ToString() + "年" + mmm.ToString() + "ヶ月"; } } } |
・当年度末の勤続年数/年齢
時々出てくる当年度というのはだいたい4月~3月の期間で、会社によって締日が月末ではない場合もあり、例えば20日締の場合など3/21~3/20のようになったりする。先ず、現在の年の3月20日として、もし現在が3月20日以降の場合、現在の年に+1年の3月20日にする。
ちなみに年度末が12/31を指す場合は、現在の年の12月31日とすればいいので特に計算する必要はない。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 |
using System; using System.Windows.Forms; namespace WindowsFormsApp1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); textBox1.LostFocus += DateParse; textBox2.LostFocus += DateParse; } private void DateParse(object sender, EventArgs e) { TextBox textBox = (TextBox)sender; try { textBox.Text = DateTime.Parse(textBox.Text).ToString("yyyy/MM/dd"); } catch { textBox.Text = ""; } GetDuration(); } private DateTime GetYearEnd(DateTime target) { var yearEnd = new DateTime(target.Year, 3, 20); if (target > yearEnd) yearEnd = yearEnd.AddYears(1); return yearEnd; } private void GetDuration() { if (textBox1.Text == "" || textBox2.Text == "") return; var startDate = DateTime.Parse(textBox1.Text); var endDate = DateTime.Parse(textBox2.Text); endDate = GetYearEnd(endDate); // 年度末 if (startDate > endDate) return; int y = endDate.Year - startDate.Year; int m = endDate.Month - startDate.Month; if (startDate.Month > endDate.Month) { y = y - 1; m = 12 + m; // mはマイナスの値が入っている } bool isLastDay = false; if (endDate.Month != endDate.AddDays(1).Month) isLastDay = true; // 月末かどうか int yyy = y; int mmm = m; if (startDate.Day > endDate.Day && !isLastDay) mmm = m - 1; if (mmm == -1) // mmmは最低でもm=0で-1され-1まで { yyy = y - 1; mmm = 11; } textBox3.Text = yyy.ToString() + "年" + mmm.ToString() + "ヶ月"; } } } |