📎
【Dart/Flutter】現在月から過去1年間の月の数字取得(コピペ用)
背景は、DateTime.now()
から分かる現在の月から、
一年を遡って取得したかったことからです。
(例:4月の場合は、4,3,2,1,12・・・,5)
【Dart/Flutter】現在月から過去1年間の月の数字取得
コード案
-
List<E>.generate()
関数を利用- 参照:【Dart】List,Set,Mapの作り方
- 指定長さ分、generatorを利用し、好きな値を格納したListを作成
- growableはデフォルトtrue
- 参照:【Dart】List,Set,Mapの作り方
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の場合
-
- 1から12までの数字を周期的に生成する場合、
-
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