👻
Flutter(Dart)で月の全ての日付を取得する方法(コピペ用)
はじめに
Flutter でグラフを作成する際に、x 軸のメモリを月の日付リストが必要でした。ふと、どうやってある月の全日付リストを取得しようかな..と一瞬迷いました。
今回もコピペできる Tool 用としてメモしておきます。
以下の例は、2021 年 11 月の全ての日付リストを取得するコードです。
月の全日付を取得するコード(アイデア1)
// 選択された月の日付リストを取得
// 2021年11月を指定
final selectedDate = DateTime(2021,11);
// 2021年11月の日数を取得
final allDaysInMonth = generateDayCountInMonth(selectedDate);
// 全日付リストを取得
final targetMonthDateList =
List<DateTime>.generate(allDaysInMonth, (i) => DateTime(selectedDate.year, selectedDate.month, i + 1));
特定の月の日数を取得するロジック部分
// 特定の月の日数を取得するロジック
int generateDayCountInMonth(DateTime date) {
final firstDayThisMonth = DateTime(date.year, date.month, date.day);
final firstDayNextMonth = DateTime(firstDayThisMonth.year, firstDayThisMonth.month + 1, firstDayThisMonth.day);
return firstDayNextMonth.difference(firstDayThisMonth).inDays;
}
1.月の日数を取得 2.日数から日付リストを作成
という流れですね。
コピペ用ツールとして使っていただけたら幸いです。
アイデア2
白陽さんに助言をいただきました!ありがとうございました!
final selectedDate = DateTime(2021, 11);
final lastDateThisMonth =
DateTime(selectedDate.year, selectedDate.month + 1, 1).subtract(const Duration(days: 1));
final firstDateThisMonth = DateTime(selectedDate.year, selectedDate.month, 1);
final targetMonthDateList =
List<DateTime>.generate(lastDateThisMonth.day, (i) => firstDateThisMonth.add(Duration(days: i)));
1.指定した月の初日と最終日を取得 2.最終日から得られた日数を用いて、全日付を生成。
アイデア1よりスッキリしました!
アイデア 3
for ループを使った方法
考え方としては、こちらもシンプルな気がします。
const int kMaxDaysInMonth = 31;
final selectedDate = DateTime(2021, 11);
List<DateTime> targetMonthDateList = [];
for (var i = 0; i < kMaxDaysInMonth; i++) {
final date = selectedDate.add(Duration(days: i));
if (date.month != selectedDate.month) break;
targetMonthDateList.add(date);
}
print(targetMonthDateList);
最後に
月の日付リストを取得するロジックが3パターンも完成しました。
Twitter で白陽さんが助言をしてくださったからこそです。
ありがとうございました。
議論してコードを磨くのもいいなぁと思いました。
Twitter では Flutter を中心とする技術関連の情報を発信しています!
参考
お仕事の依頼は以下のメールアドレスまでご連絡をよろしくお願いします。
mark.saito@jp-gx.com
Discussion