2015-04-19 8 views
5

Ho cercato il blog Parse per vedere se riesco a ottenere la soluzione a questo, ma non ho ricevuto alcuna risposta soddisfacente. Quindi, anche se farò chiaramente la domanda qui con tutti i dettagli così che chiunque altro si trovi in ​​una situazione simile troverà facile lavorare.Salvataggio di data e ora nel backend Parse

Richiesta: Ho un campo di testo di partenza e di ritorno che viene aggiornato utilizzando un singolo UIDatePicker. Voglio salvare le date selezionate nel mio database Parse.com. A cui posso interrogare e filtrare i dati. Voglio anche memorizzare il fuso orario locale in analisi, se possibile. Sto lavorando con il controllo del numero di giorni ma non era pertinente a questa domanda, quindi non includo il codice per questo.

Success & Problema: Sono in grado di salvare la data e l'ora corrette in formato String, ma quando provo a salvare nel formato NSDate utilizzando il codice riportato di seguito, ho ottenuto un orario errato.

Per ex: mia selezione data e salva in parse sono le seguenti:

Partenza: selezione Selezione data: 01/Maggio/2015 01:00 0530
data memorizzata in Parse: Apr 30, 2015, 19:30

data di ritorno: selezione selezione data: 02/maggio/2015 01:00 0530
data memorizzata in Parse: May 01, 2015, 19:30

// Il mio codice è il seguente:

@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") 
      } 
     } 
    } 
} 

// colonna del database Parse e digitare una data di viaggio & returnDate sono definiti come di tipo "String"

departureDate & rdate sono definiti come di tipo "Data"

Solo per informazioni: I sto usando la piattaforma - iOS Swift (xcode 6.3, swift 1.2) Database backend = Parse.com

+1

Parse memorizza la data in GMT. È possibile aggiungere un campo aggiuntivo da analizzare per la memorizzazione del fuso orario e utilizzarlo durante la lettura dei dati per interpretare la data nella zona a cui si fa riferimento. – Volker

+0

@Volker Grazie per la pronta risposta. Quindi quello che ho fatto è, usato postingLocZone = NSTimeZone.localTimeZone(). Abbreviation! e salvato nel mio backend Parse. Più tardi durante il recupero, ho usato dateFormatter.timeZone = NSTimeZone (abbreviazione: "\ (locationZone)"). Questo mi dà i risultati richiesti. Ma è questo il modo giusto per farlo? Coz se l'utente cambia la sua posizione, non cambierà la data di pubblicazione (come cambierà anche NSTimeZone)? Sono un po 'confuso qui. Sarebbe davvero d'aiuto se potessi esprimere il tuo parere su questo.Grazie :) –

+0

Questo è sempre un problema: puoi verificare se il fuso orario locale dell'utente e il fuso orario salvato sono diversi e chiedere all'utente una risoluzione, ad esempio. A seconda dei dati, potrebbe anche essere sufficiente passare al fuso orario locale senza chiedere conferma. – Volker

risposta

0

Poiché Parse memorizza le date referenc a GMT, quando li controlli in analisi o li recuperi, potresti trovare questa differenza nel fuso orario locale. In generale le date sono memorizzate in GMT.

È possibile aggiungere un campo aggiuntivo nel database di analisi e memorizzare lì il fuso orario locale. Quando si recuperano i dati, è possibile utilizzare tali informazioni per interpretare la data nella zona a cui si fa riferimento.

A seconda del tipo di dati memorizzati potrebbe essere opportuno interpretare sempre la data nel fuso orario locale dell'utente, anche se questo è cambiato. Puoi anche chiedere all'utente una risoluzione se il fuso orario e il fuso orario dell'utente sono diversi (quindi l'utente si è trasferito).