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

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

ただいまの
回答率

90.51%

  • Swift

    7239questions

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

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

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,748

todayske

score 19

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

extension Date {
    static func getDiff(_ date1:Foundation.Date, _ date2:Foundation.Date)-> Int{
        let calendar = Calendar.current
        let diffDays = abs(calendar.compare(date1, to: date2, toGranularity: .day).rawValue)

        print("date1 : ", date1)
        print("date2 : ", date2)
        print("day1 : ", calendar.component(.day, from: date1))
        print("day2 : ", calendar.component(.day, from: date2))
        print("diffDays : ", diffDays)
        return diffDays
    }
}


結果

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になってほしい。

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

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

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

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


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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • fuzzball

    2017/03/31 10:14

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

    キャンセル

  • todayske

    2017/03/31 10:25

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

    キャンセル

回答 1

checkベストアンサー

+1

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

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

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

 追記

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/03/31 17:25

    > まず、compare(_:​to:​to​Granularity:​)は比較するだけの関数なので間違いです。
    これの rawValue が、やりたいことと同じイメージなのかと思っていたのですが、そんなことはなかったですか?
    (そもそもそういう用途のメソッドじゃない、ということでしょうか?)

    > で、date​Components(_:​from:​to:​)でうまくいきませんか?
    > こちらでは2が返ってきましたが‥。
    私の環境だとこれが何故か上手くいきませんでした。(質問欄にキャプチャを追加しました)
    シミュレーターや実機や別の PC で実行してみたりしたのですが、上手くいかず。。。

    キャンセル

  • 2017/03/31 17:31

    >>そもそもそういう用途のメソッドじゃない、ということでしょうか?
    そうです。この関数の戻り値はComparison​Resultです。
    1が返ってくるのは.ordered​Descendingだからです。
    https://developer.apple.com/reference/foundation/comparisonresult/1395265-ordereddescending

    キャプチャは今から見てみます。

    キャンセル

  • 2017/03/31 17:54

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

    キャンセル

  • 2017/03/31 18:04

    > >>そもそもそういう用途のメソッドじゃない、ということでしょうか?
    > そうです。この関数の戻り値はComparison​Resultです。
    あ、本当ですね! 大変失礼しました。(なんでこれでいけると思ってたんだろうw)

    > 2つのDateの時分秒を0にしてから差分を求めて下さい。
    できました! ありがとうございます!!
    でもなんで、時分秒が0じゃないと上手くいかなかったのでしょう?
    なんか手間もかかるし、メソッドとして直感的じゃないような気がするのですが、そうあるべきなんでしょうか?(私が何か重要な概念を知らないだけなのでしょうか?)

    キャンセル

  • 2017/03/31 18:23

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

    キャンセル

  • 2017/03/31 18:32

    理解しました。
    day が1に満たない場合も、私は1を期待していたから、上手くいかなかったのですね。
    hour や minute も出力していたら自己解決できたかもしれなかったです。

    今回、すごく勉強になりました。
    ありがとうございます!!

    キャンセル

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

  • ただいまの回答率 90.51%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Swift

    7239questions

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