Problem mit Calendar und startOfDay

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Problem mit Calendar und startOfDay

    Hallo zusammen,

    ich habe folgende Problemstellung und verstehe nicht so wirklich das Ergebnis meines Codes. Ich möchte ermitteln ob es der gleiche Tag ist um damit dann mit Hilfe eines NSPredicate einen fetchRequest zu CoreData abzusetzen, aber nur wenn es keinen Eintrag in der DB von diesem Tag bereits gibt.
    Dazu habe ich folgenden Code geschrieben:

    C-Quellcode

    1. // Get the current calendar with local time zone
    2. var calendar = Calendar.current
    3. calendar.timeZone = NSTimeZone.local
    4. print ("CalenderTZ: \(calendar.timeZone)")
    5. // Get today's beginning & end
    6. let dateFrom = calendar.startOfDay(for: Date()) // eg. 2016-10-10 00:00:00
    7. let dateTo = calendar.date(byAdding: .day, value: 1, to: dateFrom)
    8. print("DateFrom: \(String(describing: dateFrom))")
    9. print("DateTo: \(String(describing: dateTo))")


    Hier nun die Ausgabe bei mir im Simulator mit Xcode 12.4:

    Quellcode

    1. CalenderTZ: Europe/Berlin (autoupdatingCurrent)
    2. DateFrom: 2021-04-07 22:00:00 +0000
    3. DateTo: Optional(2021-04-08 22:00:00 +0000)
    Ich versteh nicht warum DateFrom 2021-04-07 22:00:00 +0000 ist ??

    Was mache ich hier falsch?

    Gruß

    Ralf
  • Hast Du mal nach meinen Stichworten gegooglet?

    Die Europäische Sommerzeit entspricht der Standardzeit plus zwei Stunden. Deine Logausgabe ist in UTC, daher ist Mitternacht eben 22:00 Uhr.

    Mit anderen Worten: Du hast eigentlich gar kein Problem (solltest bei Datumsoperationen / -vergleichen aber immer die Zeitzonen im Blick behalten). Vorausgesetzt, Dein Core Data Model bildet das Datum ebenfalls entsprechend ab.

    Mattes
    Diese Seite bleibt aus technischen Gründen unbedruckt.
  • Hallo @manoh, @MyMattes,

    Danke für Eure Antworten und Erläuterungen :)
    Ich habe den print nun folgendermaßen geändert (Danke manoh) und sehe jetzt das von mir erwartete Datum:

    C-Quellcode

    1. print("DateFrom: \(dateFrom.description(with: localeDe))")
    2. print("DateTo: \(dateTo!.description(with: localeDe))")


    Quellcode

    1. CalenderTZ: Europe/Berlin (autoupdatingCurrent)
    2. DateFrom: Donnerstag, 8. April 2021 um 00:00:00 Mitteleuropäische Sommerzeit
    3. DateTo: Freitag, 9. April 2021 um 00:00:00 Mitteleuropäische Sommerzeit
    4. TestCount: 1
    5. Entry from same day - do not save data!
    In der Datenbank habe ich ein Attribute "date" vom Type "Date". Ich muss jetzt mal ein bisschen testen ob der Vergleich auch den gewünschten Erfolg bringt. Der Code sieht so aus:

    C-Quellcode

    1. let fromPredicate = NSPredicate(format: "%@ >= %@", date as NSDate, dateFrom as NSDate)
    2. let toPredicate = NSPredicate(format: "%@ < %@", date as NSDate, dateTo! as NSDate)
    3. let datePredicate = NSCompoundPredicate(andPredicateWithSubpredicates: [fromPredicate, toPredicate])
    4. fetchRequest.predicate = datePredicate
    5. do {
    6. let test = try viewContext.fetch(fetchRequest)
    7. print ("TestCount: \(test.count)")
    8. if test.count >= 1 {
    9. print("Entry from same day - do not save data!")
    10. } else {
    11. print("No entry from today - save data!")
    12. let newValue = Rate(context: viewContext)
    13. newValue.profit = profit
    14. newValue.date = date
    15. try viewContext.save()
    16. }
    17. } catch {
    18. print(error)
    19. }
    Alles anzeigen
    Wenn ich da Probleme/Fragen habe würde ich das in einem eigenen Thread adressieren.
    Wünsche noch einen schönen Abend.

    VG Ralf
  • Hallo @MyMattes,

    vielen Dank für die nützlichen Infos - da ich mit Core Data noch am Anfang stehe sind hier alle Infos für mich sehr wertvoll!!
    Ich habe den Code folgendermaßen geändert:

    C-Quellcode

    1. do {
    2. let test = try viewContext.count(for: fetchRequest)
    3. print ("TestCount: \(test)")
    4. if test >= 1 {
    5. print("Entry from same day - do not save data!")
    6. } else {
    7. print("No entry from today - save data!")
    8. let newValue = Rate(context: viewContext)
    9. newValue.eur_dollar = eur_dollar
    10. newValue.date = date
    11. try viewContext.save()
    12. }
    13. } catch {
    14. print(error)
    15. }
    Alles anzeigen