【发布时间】:2015-04-19 04:48:09
【问题描述】:
我已经搜索了 Parse 博客,看看我是否可以得到解决方案,但没有得到任何满意的答案。因此,尽管我会在这里清楚地提出所有细节的问题,以便其他陷入类似情况的人会发现它很容易工作。
需要: 我有一个使用单个 UIDatePicker 更新的出发和返回文本字段。我想将选定的日期保存在我的 Parse.com 数据库中。我可以查询和过滤数据。如果可能的话,我还想在解析中存储本地时区。我正在检查天数,但它与这个问题无关,所以不包括代码。
成功与问题: 我能够以字符串格式保存正确的日期和时间,但是当我尝试使用下面的代码以 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 被定义为“String”类型
departureDate & rDate 定义为“日期”类型
仅供参考:我正在使用 平台 - iOS Swift (xcode 6.3, swift 1.2) 数据库后端 = Parse.com
【问题讨论】:
-
Parse 以 GMT 格式存储日期。您可以添加一个额外的字段来解析以存储时区,并在读取数据时使用它来解释引用它的区域中的日期。
-
@Volker 感谢您的及时回复。所以我所做的是,使用了postingLocZone = NSTimeZone.localTimeZone().abbreviation!并将其保存在我的 Parse 后端。后来在检索时,我使用了 dateFormatter.timeZone = NSTimeZone(abbreviation: "(locationZone)")。这给了我所需的结果。但这是正确的方法吗?因为如果用户改变了他的位置,发布日期不会改变(因为 NSTimeZone 也会改变)?我在这里有点困惑。如果你能就此发表你的看法,那真的很有帮助。谢谢:)
-
这总是一个问题 - 您可以检查用户的本地时区和保存的时区是否不同,并要求用户提供解决方案。根据您的数据,也可以在不提示的情况下更改为本地时区。
-
哈姆...谢谢。好吧,如果我必须确定的话。我将不得不为每个位置(发布区、出发区和返回区)实施 NSTimeZone 并据此显示日期。就像应用程序的用户应该知道他/她什么时候必须从 X 出发并从 Y 位置开始回程一样。这可能有效,但我只是想知道这是否是正确的方法?我将拭目以待,看看其他 SO 专家对此有何看法。
标签: ios swift parse-platform