質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

2回答

1382閲覧

2つ間の日付を配列で取得したい

sgyeta

総合スコア23

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2018/10/26 06:10

前提・実現したいこと

現在の日付から1年前と1年後を計算して
その間の日付の年月を取得したいのですが
いまいち書き方がわからなかったのでご教示頂きたいです。

欲しい値としては(年,月)を(Int,Int)の配列で取得したいです。
実行結果で言うところ26以下の部分の情報は不要です。

該当のソースコード

Swift

1let calendar = Calendar.current 2let date = Date() 3let oneYearAgoDate = calendar.date(byAdding: .year, value: -1, to: date)! 4let oneYearLaterDate = calendar.date(byAdding: .year, value: 1, to: date)! 5let oneYearLaterDateMonth = calendar.component(.month, from: oneYearLaterDate) 6let oneYearLaterDateYear = calendar.component(.year, from: oneYearLaterDate) 7 8var tmpDate = oneYearAgoDate 9var month = calendar.component(.month, from: tmpDate) 10var year = calendar.component(.year, from: tmpDate) 11 12while( oneYearLaterDateMonth != month || oneYearLaterDateYear != year ){ 13 let addedDate = calendar.date(byAdding: .month, value: 1, to: tmpDate)! 14 print(addedDate) 15 tmpDate = addedDate 16 17 month = calendar.component(.month, from: addedDate) 18 year = calendar.component(.year, from: addedDate) 19}

実行結果

2017-11-26 05:51:04 +0000 2017-12-26 05:51:04 +0000 2018-01-26 05:51:04 +0000 2018-02-26 05:51:04 +0000 2018-03-26 05:51:04 +0000 2018-04-26 05:51:04 +0000 2018-05-26 05:51:04 +0000 2018-06-26 05:51:04 +0000 2018-07-26 05:51:04 +0000 2018-08-26 05:51:04 +0000 2018-09-26 05:51:04 +0000 2018-10-26 05:51:04 +0000 2018-11-26 05:51:04 +0000 2018-12-26 05:51:04 +0000 2019-01-26 05:51:04 +0000 2019-02-26 05:51:04 +0000 2019-03-26 05:51:04 +0000 2019-04-26 05:51:04 +0000 2019-05-26 05:51:04 +0000 2019-06-26 05:51:04 +0000 2019-07-26 05:51:04 +0000 2019-08-26 05:51:04 +0000 2019-09-26 05:51:04 +0000 2019-10-26 05:51:04 +0000

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

takabosoft

2018/10/26 06:17 編集

具体的に「いまいち書き方がわからなかった」のはどんな処理でしょうか?(現状のコードで何か問題はありますか?)
sgyeta

2018/10/26 06:22

コメントありがとうございます。具体的には計算で求めた1年前と1年後の間に当たるDate型の日付の求め方が、上記の書き方だと単調だと思ったので、もっと簡潔に求めることが出来る方法がないかと思い質問させて頂きました。
takabosoft

2018/10/26 06:47

なるほど。で、「現在の日付から1年前と1年後」というのは、今日が2018-10-26だとして、2017-11から2019-10までで良いのでしょうか? 2017-10が抜けていますが、意図したものですか?
sgyeta

2018/10/26 06:49

意図したものではないですね・・・。2017-10〜2019-10で取得がしたいです。
guest

回答2

0

せっかくなのでDateComponentsを活用して書いてみました。

swift

1let calendar = Calendar.current//(identifier: .gregorian) 2let date = Date() 3var addComps = DateComponents() 4for month in -12...12 { 5 addComps.month = month 6 if let date = calendar.date(byAdding: addComps, to: date) { 7 let comps = calendar.dateComponents([.year, .month], from: date) 8 print(comps.year ?? 0, comps.month ?? 0) 9 } 10}

text

12017 10 22017 11 32017 12 42018 1 52018 2 62018 3 72018 4 82018 5 92018 6 102018 7 112018 8 122018 9 132018 10 142018 11 152018 12 162019 1 172019 2 182019 3 192019 4 202019 5 212019 6 222019 7 232019 8 242019 9 252019 10

投稿2018/10/26 09:18

編集2018/10/26 09:23
fuzzball

総合スコア16731

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sgyeta

2018/10/28 15:19

ご回答頂きありがとうございます! Swiftの日時操作不慣れなので、非常に勉強になります!
guest

0

ベストアンサー

こんな感じでしょうかねー
やろうと思えば、もう少し短く書けますが、今回はわかり易さ重視で書いています。

swift:

1 func hoge() -> [(Int, Int)] { 2 var result: [(Int, Int)] = [] 3 4 let calendar = Calendar(identifier: .gregorian) 5 let date = Date() 6 var year = calendar.component(.year, from: date) - 1 7 var month = calendar.component(.month, from: date) 8 9 for _ in 0...24 { 10 result.append((year, month)) 11 month += 1 12 if month == 13 { 13 year += 1 14 month = 1 15 } 16 } 17 18 return result 19 }

text:output

1[(2017, 10), (2017, 11), (2017, 12), (2018, 1), (2018, 2), (2018, 3), (2018, 4), (2018, 5), (2018, 6), (2018, 7), (2018, 8), (2018, 9), (2018, 10), (2018, 11), (2018, 12), (2019, 1), (2019, 2), (2019, 3), (2019, 4), (2019, 5), (2019, 6), (2019, 7), (2019, 8), (2019, 9), (2019, 10)]

注意点としてCalendar.currentを使ってしまうと端末が和暦設定になっている場合、calendar.component(.year, from: date)で取れる値は2018ではなく平成30年の30になります。西暦で欲しければ上記の書き方にしてください。

投稿2018/10/26 07:04

takabosoft

総合スコア8356

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sgyeta

2018/10/26 07:09

ご回答頂きありがとうございます! 早速手元で試してみました。 >注意点としてCalendar.currentを使ってしまうと端末が和暦設定になっている場合、 calendar.component(.year, from: date)で取れる値は2018ではなく平成30年の30になります こちらは知らなかったので非常に勉強になりました。 ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問