はじめに
- プロジェクトにおいて1ヶ月前、1ヶ月後の定義はバラバラなので本記事が正解とは限りません。
- 個人的に結果が綺麗だと思う定義での取得方法です。
結論
リンクのDartPadで色々試せます。
https://dartpad.dev/?id=d22e226e0854357340cf24ec0a6f2707
final baseDate = DateTime(2022, 1, 29); // 任意の日付
final prevMonthLastDay = DateTime(baseDate.year, baseDate.month, 0);
final thisMonthLastDay = DateTime(baseDate.year, baseDate.month + 1, 0);
final prevDiff =
baseDate.day < prevMonthLastDay.day ? prevMonthLastDay.day : baseDate.day;
final prevMonth = baseDate.subtract(Duration(days: prevDiff)); // 1ヶ月前
final nextMonthLastDay = DateTime(baseDate.year, baseDate.month + 2, 0);
final nextDiff = baseDate.day < nextMonthLastDay.day
? thisMonthLastDay.day
: nextMonthLastDay.difference(baseDate).inDays;
final nextMonth = baseDate.add(Duration(days: nextDiff)); // 1ヶ月後
1ヶ月前
定義
- 基本的に基準となる年月日の月を-1する。(例:2023/02/14→2023/01/14)
- 月が1月の場合、年を-1して、月は12になる(例:2023/01/14→2022/12/14)
- 基準日の1ヶ月前の月の日数より基準日の日付が大きい場合、1ヶ月前の月末になる(例:2023/05/31→2023/04/30)
コード
final baseDate = DateTime(2022, 3, 30); // 任意の日付
final prevMonthLastDay = DateTime(baseDate.year, baseDate.month, 0);
final prevDiff =
baseDate.day < prevMonthLastDay.day ? prevMonthLastDay.day : baseDate.day;
// 基準日と1ヶ月前の日付の間隔。
// 基本的に1ヶ月前は基準日から前月の月の日数分引けば求められる。
// 基準日の1ヶ月前の月の日数より基準日の日付が大きい場合は前月の月末にするために基準日の日付を引く。
final prevMonth = baseDate.subtract(Duration(days: prevDiff)); // 1ヶ月前
// subtract()は引数のDuration分時間を戻す関数
1ヶ月後
定義
- 基本的に基準となる年月日の月を+1する。 (例:2023/02/14→2023/03/14)
- 月が1月の場合、年を+1して、月は1にする。(例:2022/12/14→2023/01/14)
- 基準日の1ヶ月後の月の日数より基準となる年月日の日が大きい場合、1ヶ月後の月末になる。 (例:2023/05/31→2023/06/30)
コード
final baseDate = DateTime(2022, 1, 31); // 任意の日付
final thisMonthLastDay = DateTime(baseDate.year, baseDate.month + 1, 0);
final nextMonthLastDay = DateTime(baseDate.year, baseDate.month + 2, 0);
final nextDiff =
baseDate.day < nextMonthLastDay.day ? nextMonthLastDay.difference(baseDate).inDays;
// 基準日と1ヶ月後の日付の間隔。
// 基本的に1ヶ月後は基準日から今月の月の日数分足せば求められる。
// 基準日の1ヶ月後の月の日数より基準日の日付が大きい場合は翌月の月末にするために基準日から翌月末までの日数分を足す。
final nextMonth = baseDate.add(Duration(days: nextDiff)); // 1ヶ月後
// add()は引数のDuration分時間を進める関数
さいごに
上記コードを参考にDateTimeにextensionしてgetterでも関数でも定義すれば使えば使い易くなります。
久しぶりに記事を書いて文章をまとめる能力が低いと思い知らされました。
少しでも誰かの参考になれば嬉しいです。