👻

Flutter(Dart)で月の全ての日付を取得する方法(コピペ用)

2021/11/25に公開約2,000字

はじめに

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で白陽さんが助言をしてくださったからこそです。
ありがとうございました。
議論してコードを磨くのもいいなぁと思いました。

参考

https://www.fixes.pub/program/2520.html
GitHubで編集を提案

Discussion

ログインするとコメントできます