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

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

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

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

Q&A

1回答

557閲覧

Firestoreで登録したデータを日付ごとに取りたい

oyasumi

総合スコア13

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

0グッド

0クリップ

投稿2018/10/30 04:58

前提・実現したいこと

timestamp型のデータを日付ごとに絞り込む方法がわからず悩んでおります。
最終的に実現したいこととしては
登録したデータを日付ごとに絞り込んで取得したいです。
最悪型はtimestamp型にならなくても大丈夫です。

試したこと

dateformatterでstringにしたものをインサートしたりしたのですが
結局現在の日付のスタートとエンドをうまく表示できずいきづまっています。

swift

1let df = DateFormatter() 2 df.calendar = Calendar(identifier: .gregorian) 3 df.dateFormat = "yyyyMM" 4 df.locale = Locale(identifier: "ja_JP") 5 if let date = df.date(from: "201703") { 6 print(Calendar.current.timeZone) //Asia/Tokyo 7 print(date) //timezoneは合っているはずなのにグリニッジ標準時になる2017-02-28 15:00:00 +0000 8 9 } else { 10 print("error") 11 }

補足情報(FW/ツールのバージョンなど)

XCode 9.4.1
Swift 4.1.2

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

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

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

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

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

fuzzball

2018/10/30 07:55

この質問、Firestoreは関係あるんでしょうか?余計なタグや文言を付けると回答減りますよ。(私も「Firestore」って書いていたのでスルーしてましたが、ちょっと見てみたらFirestore関係無さそうで)
fuzzball

2018/10/30 07:58 編集

「201703」という入力から「2017-03-01 00:00:00 +0900」を表示さたい、という質問なのでしょうか?
guest

回答1

0

まだ探しているでしょうか???

自分も、日付をfirestoreに保存する過程で、
DateFormatterを利用しハマったことがあります。

結論から言うと、DateFormatterは不正確となることがあるので、
利用は表現形式を変え表示する時にのみ使うのが良いように感じます。
(自分はその時ですら使わないようにしています。)
試しにprint()で入力前の値、保存された値と呼び出した値を
それぞれ出力してみると違いが出るのではないでしょうか?

string→Dateには自分はcalendarを利用するようにしています。
下記にサンプルを載せておきます。適宜"2019/1/1"の表現系を変えてみてください。

Swift

1 // MARK: -- Format Converter 2 func makeDatefromString(string: String) -> Date { 3 let array = string.components(separatedBy: "/") 4 let calendar = Calendar.current 5 let components = DateComponents( 6 calendar: calendar, 7 year: Int(array[0]), 8 month: Int(array[1]), 9 day: Int(array[2]), 10 hour: 0, 11 minute: 0) 12 let date = calendar.date(from: components) 13 return date! 14 } 15 16 func makeStringfromDate(date: Date) -> String { 17 let calendar = Calendar.current 18 let cyear = calendar.component(.year, from: date) 19 let cmonth = calendar.component(.month, from: date) 20 let cday = calendar.component(.day, from: date) 21 let date_S = String(cyear) + String(cmonth) + String(cday) 22 return date_S 23 }

下記参照
http://y-hryk.hatenablog.com/entry/2018/04/22/014556

さらに、firestoreでの取得方法は

Swift

1var ref: DocumentReference? = nil // グローバルで宣言 2 3func getData() { 4 let db = Firestore.firestore() 5 db.collection("hoge").whereField("date", isGreaterThan: *****).getDocuments { (querySnapshot, err) in 6 } 7}

上記が以上なので、同様にisLessThanで制限すれば指定期間で取得できると思います。
Date型でそのまま比較できるかはわかりません。
自分はtimeintervalsince1970を利用して、
単純なDouble型に変換しています。
一手間かかりますが、その方が検索も早いのではないかと勝手に思ってます。

投稿2019/01/01 11:21

hameji001

総合スコア639

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問