Дата и время сохранения в 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)")
Надеюсь это поможет!