2015-04-19 13 views
5

Ich habe Pars blog durchsucht, um zu sehen, ob ich die Lösung dafür bekommen kann, aber keine befriedigende Antwort bekommen habe. Also werde ich klar die Frage hier mit allen Details stellen, damit jeder andere in einer ähnlichen Situation stecken wird, wird es leicht zu arbeiten finden.Speichern von Datum und Uhrzeit in Parse-Backend

Benötigen Sie: Ich habe eine Abfahrt und zurück Textfeld, die mit einem einzigen UIDatePicker aktualisiert werden. Ich möchte die ausgewählten Daten in meiner Parse.com-Datenbank speichern. Zu welchen ich Daten abfragen und filtern kann. Ich möchte auch lokale Zeitzone in Parse wenn möglich speichern. Ich arbeite mit der Überprüfung der Anzahl der Tage, aber es war nicht relevant für diese Frage, also nicht einschließlich den Code dafür.

Erfolg & Problem: Ich bin in der Lage, korrektes Datum und Uhrzeit im String-Format zu speichern, aber wenn ich versuche, im NSDate-Format mit dem folgenden Code zu speichern, bekomme ich falsche Zeit.

Für Ex: meine aktuellen Auswahl und gespeicherte Ergebnis in Parse sind wie folgt:

Datum Abreise: Date Picker Auswahl: 01/Mai/2015 01.00 0530
gespeicherte Datum in Parse: April 30, 2015, 19:30

Zurück Datum: Date Picker Auswahl: 02/Mai/2015 01.00 0530
gespeicherte Datum in Parse: 01. Mai 2015, 19:30

// Mein Code ist wie folgt:

@IBOutlet var dOfTravelText: UITextField! 
@IBOutlet var returnDateText: UITextField! 

lazy var dateFormatter: NSDateFormatter = { 
    let dateFormatter = NSDateFormatter() 
    dateFormatter.dateFormat = "dd/MMM/yyyy hh:mm a Z" 
    //  dateFormatter.dateStyle = .MediumStyle 
    //  dateFormatter.timeStyle = .ShortStyle 
    return dateFormatter 
    }() 

    @IBAction func travelDatePicker(sender: UITextField) { 

    datePickerView.minimumDate = NSDate() 
    datePickerView.datePickerMode = UIDatePickerMode.DateAndTime 
    sender.inputView = datePickerView 
    timeSelected = sender 
    datePickerView.addTarget(self, action: "handleDatePicker:", forControlEvents: UIControlEvents.AllEvents) 
} 

// Date Picker target - Displaying date in textfield 
func handleDatePicker(sender: UIDatePicker) { 
    //var dateFormatter = NSDateFormatter() 
    //dateFormatter.dateFormat = "mm/dd/yyyy" 
    timeSelected.text = dateFormatter.stringFromDate(sender.date) 
    println("From Date \(dOfTravelText.text!)") 
    println("To Date \(returnDateText.text!)") 
} 

// Submitting the dates to parse backend 
    @IBAction func postBtn(sender: AnyObject) { 
      let date = NSDate() 
      let calendar = NSCalendar.currentCalendar() 
      let components = calendar.components(.CalendarUnitHour | .CalendarUnitMinute, fromDate: date) 
      let dateMakerFormatter = NSDateFormatter() 
      dateMakerFormatter.dateFormat = "dd/MMM/yyyy hh:mm a Z" 

     let dD = dateMakerFormatter.dateFromString("\(dOfTravelText.text!)")! 
     let departureD = NSDateFormatter.localizedStringFromDate(dD, dateStyle: .MediumStyle, timeStyle: .ShortStyle) 
     println("From-------...\(departureD)") 

     let rD = dateMakerFormatter.dateFromString("\(returnDateText.text!)")! 
     let returnD = NSDateFormatter.localizedStringFromDate(rD, dateStyle: .MediumStyle, timeStyle: .ShortStyle) 
     println("To-------\(returnD)") 

     var userPost = PFObject(className:"UserPost") 
     userPost["departureDate"] = dD // Works but has Wrong time 
     userPost["rDate"] = rD // Works but Wrong time 
     userPost["travelDate"] = dOfTravelText.text // Works but it is stored in String format 
     userPost["returnDate"] = returnDateText.text // Works but it is stored in string format 
     userPost.saveInBackgroundWithBlock { 
      (success, error: NSError?) -> Void in 
      if (success) { 
       // The object has been saved. 
       println("Saved") 

      } else { 
       // There was a problem, check error.description 
       println("Error") 
      } 
     } 
    } 
} 

// Parsen Datenbankspalte und einen Reise & return Typ als vom Typ "String" definiert

departureDate & rdate wird als vom Typ "Datum" definiert

Nur zur Information: I Platform ist mit - iOS Swift (Xcode 6.3, schnellen 1.2) Datenbank backend = Parse.com

+1

Parse speichert das Datum in GMT. Sie könnten ein zusätzliches Feld hinzufügen, um die Zeitzone zu analysieren und diese beim Lesen der Daten zu verwenden, um das Datum in der Zone zu interpretieren, in der es referenziert wird. – Volker

+0

@Volker Vielen Dank für die schnelle Antwort. Was ich also gemacht habe, war postingLocZone = NSTimeZone.localTimeZone(). Abkürzung! und habe es in meinem Parse-Backend gespeichert. Später beim Abrufen habe ich dateFormatter.timeZone = NSTimeZone (Abkürzung: "\ (locationZone)") verwendet. Dies gibt mir die erforderlichen Ergebnisse. Aber ist das der richtige Weg? Coz, wenn der Benutzer seinen Standort ändert, ändert sich das Buchungsdatum nicht (wie NSTimeZone auch ändert)? Ich bin hier etwas verwirrt. Wäre wirklich hilfreich, wenn Sie Ihre Meinung dazu äußern könnten.Danke :) –

+0

Das ist immer ein Problem - Sie könnten überprüfen, ob die lokale Zeitzone des Benutzers und die gespeicherte Zeitzone unterschiedlich sind und den Benutzer zum Beispiel nach einer Lösung fragen. Abhängig von Ihren Daten kann es auch in Ordnung sein, einfach ohne Aufforderung zur lokalen Zeitzone zu wechseln. – Volker

Antwort

0

Seit Parse speichert die Daten referenc Wenn Sie sie nach GMT durchsuchen, können Sie den Unterschied zu Ihrer lokalen Zeitzone finden. In der Regel werden Daten in GMT gespeichert.

Sie können ein zusätzliches Feld in Ihre Parse-Datenbank einfügen und dort die lokale Zeitzone speichern. Wenn Sie Daten abrufen, können Sie diese Informationen verwenden, um das Datum in der Zone zu interpretieren, in der es referenziert wird.

Abhängig von der Art der Daten, die Sie speichern, kann es in Ordnung sein, das Datum immer in der lokalen Zeitzone des Benutzers zu interpretieren Das hat sich geändert. Sie können den Benutzer auch nach einer Lösung fragen, wenn die gespeicherte Zeitzone und die Benutzerzeitzone unterschiedlich sind (der Benutzer ist also umgezogen).