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

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

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

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

Q&A

解決済

1回答

4404閲覧

ローカル時間で Date の日数差を取得したい

todayske

総合スコア36

Swift

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

0グッド

0クリップ

投稿2017/03/31 00:19

編集2017/03/31 08:20

Date の日数差を取得しようとして、以下のコードを書いたところ、欲しかった値と違うものが返ってきました。

Swift

1extension Date { 2 static func getDiff(_ date1:Foundation.Date, _ date2:Foundation.Date)-> Int{ 3 let calendar = Calendar.current 4 let diffDays = abs(calendar.compare(date1, to: date2, toGranularity: .day).rawValue) 5 6 print("date1 : ", date1) 7 print("date2 : ", date2) 8 print("day1 : ", calendar.component(.day, from: date1)) 9 print("day2 : ", calendar.component(.day, from: date2)) 10 print("diffDays : ", diffDays) 11 return diffDays 12 } 13}

結果

date1 : 2017-03-28 16:59:00 +0000 date2 : 2017-03-31 00:11:56 +0000 day1 : 29 //日本時間 (+9時間)なので、これは求めているもの。 day2 : 31 //日本時間 (+9時間)なので、これは求めているもの。 diffDays : 1 //ここが day1 と day2 の差分の、2になってほしい。

以下のコードでも同じ結果になりました。

Swift

1func daysBetweenDate(toDate: Date) -> Int { 2 let components = Calendar.current.dateComponents([.day], from: self, to: toDate) 3 return components.day ?? 0 4 }

色々検索してみても、いい答えが探せませんでした。
他のタイムゾーンでも同様に動くコードにしたいと思っています。
どうやったら、diffDays が2になるようにできるのでしょうか?

どなたかお知恵をお借りできますと、ものすごく助かります。
よろしくお願いいたします。


上手くいかないイメージ
イメージ説明

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

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

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

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

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

fuzzball

2017/03/31 01:14

日単位での差分を求めたいということでしょうか?例えば、「3/30 0:0」と「3/31 23:59」の場合も、「3/30 23:59」と「3/31 0:0」の場合も1が返ればいいのでしょうか?
todayske

2017/03/31 01:25

はい、まさにその通りです! 24時をまたいだ回数を取得したいと思っています。
guest

回答1

0

ベストアンサー

まず、compare(_:​to:​to​Granularity:​)は比較するだけの関数なので間違いです。

で、date​Components(_:​from:​to:​)でうまくいきませんか?
こちらでは2が返ってきましたが‥。

swift

1print(date1) 2print(date2) 3print(Calendar.current.dateComponents([.day], from: date1, to: date2).day ?? -1) 4//=> 2017-03-28 16:59:00 +0000 5//=> 2017-03-31 00:11:56 +0000 6//=> 2 7

追記

2つのDateの時分秒を0にしてから差分を求めて下さい。

投稿2017/03/31 02:05

編集2017/03/31 08:54
fuzzball

総合スコア16731

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

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

todayske

2017/03/31 08:25

> まず、compare(_:​to:​to​Granularity:​)は比較するだけの関数なので間違いです。 これの rawValue が、やりたいことと同じイメージなのかと思っていたのですが、そんなことはなかったですか? (そもそもそういう用途のメソッドじゃない、ということでしょうか?) > で、date​Components(_:​from:​to:​)でうまくいきませんか? > こちらでは2が返ってきましたが‥。 私の環境だとこれが何故か上手くいきませんでした。(質問欄にキャプチャを追加しました) シミュレーターや実機や別の PC で実行してみたりしたのですが、上手くいかず。。。
fuzzball

2017/03/31 08:54

すごく雑ですが回答に追記しました。
todayske

2017/03/31 09:04

> >>そもそもそういう用途のメソッドじゃない、ということでしょうか? > そうです。この関数の戻り値はComparison​Resultです。 あ、本当ですね! 大変失礼しました。(なんでこれでいけると思ってたんだろうw) > 2つのDateの時分秒を0にしてから差分を求めて下さい。 できました! ありがとうございます!! でもなんで、時分秒が0じゃないと上手くいかなかったのでしょう? なんか手間もかかるし、メソッドとして直感的じゃないような気がするのですが、そうあるべきなんでしょうか?(私が何か重要な概念を知らないだけなのでしょうか?)
fuzzball

2017/03/31 09:23

date​Components(_:​from:​to:​)の戻り値としては day=1, hour=0, minute=12, second=0 が返ってきていますので、差分を求める関数としては正しいです。これのdayだけ取り出しているので1になっているだけです。
todayske

2017/03/31 09:32

理解しました。 day が1に満たない場合も、私は1を期待していたから、上手くいかなかったのですね。 hour や minute も出力していたら自己解決できたかもしれなかったです。 今回、すごく勉強になりました。 ありがとうございます!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問