我搜索过Parse博客,看看我是否可以得到解决方案,但没有得到任何满意的答案。所以我虽然我会在这里明确提出所有细节的问题,所以其他任何陷入类似情况的人都会觉得很容易上班。
需要: 我有一个出发和返回文本字段,使用单个UIDatePicker更新。我想在Parse.com数据库中保存选定的日期。我可以查询和过滤数据。我还想在可能的情况下将本地时区存储在解析中。我正在检查天数,但这与此问题无关,因此不包括该代码。
成功&问题: 我能够以String格式保存正确的日期和时间,但是当我尝试使用下面的代码以NSDate格式保存时,我的时间错了。
例如:我的日期选择和存储的解析结果如下:
出发日期:
日期选择器选择:01 / May / 2015 01:00 AM +0530
Parse的存储日期:2015年4月30日,19:30
退货日期:
日期选择器选择:02 / May / 2015 01:00 AM +0530
Parse的存储日期:2015年5月1日,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定义为类型"字符串"
departureDate& rDate被定义为类型"日期"
仅供参考:我正在使用 平台 - iOS Swift(xcode 6.3,swift 1.2) 数据库后端= Parse.com
答案 0 :(得分:0)
由于Parse存储引用GMT的日期,当您在解析时检查它们或检索它们时,您可能会发现这与您当地的时区有所不同。通常,日期存储在GMT中。
您可以在Parse数据库中添加一个额外的字段,并在那里存储本地时区。检索数据时,您可以使用该信息来解释引用它的区域中的日期。
根据您存储的数据类型,可能总是可以在用户本地时区中解释日期,即使这已经更改。如果保存的时区和用户时区不同(因此用户已移动),您也可以要求用户提供解决方案。
答案 1 :(得分:0)
设置日期选择器:
@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
}
保存要解析的日期:
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将格式化为设备的当前timeZone-坦白地说,我从未在不同的时区进行过测试,但它适用于EST-您可以进行测试,如果没有提到,还可以保存用户时区,然后在像这样的日期格式化程序
dateFormatter.timeZone = TimeZone(abbreviation: "\(usertimeZone)")
希望这会有所帮助!