📎

【Dart/Flutter】現在月から過去1年間の月の数字取得(コピペ用)

2023/04/02に公開

背景は、DateTime.now()から分かる現在の月から、

一年を遡って取得したかったことからです。

(例:4月の場合は、4,3,2,1,12・・・,5)

【Dart/Flutter】現在月から過去1年間の月の数字取得

コード案

  • List<E>.generate()関数を利用
void main() {
  int currentMonth = DateTime.now().month;
  List<int> last12Months =
      List.generate(12, (index) => (currentMonth - index - 1) % 12 + 1);
  print(last12Months);
}

実行結果

[4, 3, 2, 1, 12, 11, 10, 9, 8, 7, 6, 5]
  • ポイント
    • List.generate(12, (index) => (currentMonth - index - 1) % 12 + 1)
      • 1から12までの数字を周期的に生成する場合、(x % 12) + 1 という式を利用
        • (currentMonth - index - 1) % 12 + 1の部分がindex % 12 + 1の場合は以下
          • [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
        • (currentMonth - index - 1) % 12 + 1の場合、generate内部では以下表の処理
          • currentMonth=4の場合
index (currentMonth - index - 1) (currentMonth - index - 1) % 12 (currentMonth - index - 1) % 12 + 1
0 3 3 4
1 2 2 3
2 1 1 2
3 0 0 1
4 -1 11 12
5 -2 10 11
6 -3 9 10
7 -4 8 9
8 -5 7 8
9 -6 6 7
10 -7 5 6
11 -8 4 5

※「%」は剰余演算子=「12で割った余りが何か?」

-1 % 12の場合

-1を12で割ったときに割り切れずに余る数が何かを考えると、-1を12で割ると、商が0、余りが-1になります。しかし、この余りは「非常に大きなマイナスの数」というよりも、「12を足してもともとの数より小さい正の数」です。つまり、-1を12で割った余りは、12を足しても-1より小さくならない数であることになります。そこで、12を足しても元の数より小さくならない、最小の正の数は11です。そのため、-1 % 12 は11となります。

以下、シンプルな回答にたどり着くまでのコード

備考

  • DateTime型を利用
void main() {
  var dt = DateTime.now();
  List<int> last12Months = [];
  for (int i = 0; i < 12; i++) {
    last12Months.add(DateTime(dt.year, dt.month - i, dt.day).month);
  }
  print(last12Months);
}

実行結果

[4, 3, 2, 1, 12, 11, 10, 9, 8, 7, 6, 5]
  • ベタ書き:与えられた月の数字から後ろ向きに12ヶ月分格納
void main() {
  int currentMonth = DateTime.now().month;
  List<int> last12Months = [];
  for (int i = 0; i < 12; i++) {
    int tmp = currentMonth + i;
    if (tmp > 12) {
      last12Months.add(tmp - 12);
    } else {
      last12Months.add(tmp);
    }
  }
  print(last12Months);
}

実行結果

[4, 5, 6, 7, 8, 9, 10, 11, 12, 1, 2, 3]

Discussion