Дата и время сохранения в Parse backend

Я искал блог Parse, чтобы узнать, смогу ли я найти решение, но не получил удовлетворительного ответа. Поэтому я, хотя я четко задам вопрос здесь со всеми деталями, чтобы любому, кто застрял в подобной ситуации, было легко работать.

Необходимость: у меня есть текстовое поле отправления и возврата, которое обновляется с помощью одного UIDatePicker. Я хочу сохранить выбранные даты в моей базе данных Parse.com. На что я могу запрашивать и фильтровать данные. Я также хочу сохранить местный часовой пояс в разборе, если это возможно. Я работаю с проверкой количества дней, но это не относится к этому вопросу, поэтому я не включил код для этого.

Успех и проблема: я могу сохранить правильную дату и время в формате String, но когда я пытаюсь сохранить в формате NSDate, используя приведенный ниже код, я получаю неправильное время.

Например, мой выбор даты и сохраненный результат в разборе:

Дата отправления: Дата выбора сборщика: 01/ май /2015 01:00 AM +0530
Сохраненная дата в Parse: 30 апреля 2015, 19:30

Дата возврата: Дата выбора сборщика: 02 мая /2015 01:00 AM +0530
Сохраненная дата в Parse: 01 мая 2015 года, 19:30

// Мой код как показано ниже:

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

// Анализируем столбец базы данных и тип travelDate & returnDate определяются как тип "String"

Дата отправления и дата определяются как "Дата"

Просто для информации: я использую Платформу - iOS Swift (xcode 6.3, swift 1.2) База данных backend = Parse.com

1 ответ

Решение

Так как Parse хранит даты, относящиеся к GMT, при их проверке или получении вы можете найти эту разницу в вашем местном часовом поясе. В целом даты хранятся в GMT.

Вы можете добавить дополнительное поле в вашу базу данных Parse и сохранить там местный часовой пояс. При извлечении данных вы можете использовать эту информацию для интерпретации даты в зоне, на которую она ссылается.

В зависимости от типа данных, которые вы храните, было бы хорошо всегда интерпретировать дату в местном часовом поясе пользователя, даже если это изменилось. Вы также можете запросить у пользователя разрешение, если сохраненный часовой пояс и часовой пояс пользователя отличаются (таким образом, пользователь переместился).

Настройка выбора даты:

@IBOutlet weak var dDDatePicker: UIDatePicker!
@IBOutlet weak var rdDatePicker: UIDatePicker!

override func viewDidLoad() {
    super.viewDidLoad()

    setUpDatePickers()
}

func setUpDatePickers() {
    // Set start date
    dDDatePicker.date = Date()
    rdDatePicker.date = Date()
    // Set min and max date if you want
    dDDatePicker.maximumDate = minDepartDate
    rdDatePicker.maximumDate = minReturnDate
    dDDatePicker.minimumDate = maxDepartDate
    rdDatePicker.minimumDate = maxReturnDate
}

Сохранение дат в Parse:

func saveUserPost() {
    let dD = dDDatePicker.date
    let rd = rdDatePicker.date

    let userPost = PFObject(className: "UserPost")

    userPost["departureDate"] = dD   
    userPost["rDate"] = rD

    userPost.saveInBackgroundWithBlock {
          (success, error) -> Void in
          if (success) {
              // The object has been saved.
              print("Saved")
          } else {
              // There was a problem, check error.description
              print("Error")
          }
     }
}

Поскольку указанная дата сохраняется в формате UTC, я бы использовал DateFormatter(), чтобы вернуть ее в строку в правильном часовом поясе:

if let dD = userPost["departureDate"] as? Date {
    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = "yyyy-MM-dd"
    let str = dateFormatter.string(from: dD)
    print("Depart date \(str)")
}
if let rD = userPost["rDate"] as? Date {
    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = "yyyy-MM-dd"
    let str = dateFormatter.string(from: rD)
    print("Return date \(str)")
}

Используйте эту ссылку, чтобы установить dateFormat, как хотите:https://nsdateformatter.com/

Насколько я понимаю, dateFormatter будет форматировать текущий часовой пояс устройства - Честно говоря, я никогда не тестировал его в разных часовых поясах, но он работает для EST - вы можете протестировать, и, если не указано иное, вы также можете сохранить часовой пояс пользователя, а затем указать в форматере даты, например так

dateFormatter.timeZone = TimeZone(abbreviation: "\(usertimeZone)")

Надеюсь это поможет!

Другие вопросы по тегам