在解析后端中保存日期和时间

问题描述 投票:5回答:2

我已经搜索了Parse博客,以查看是否可以找到解决方案,但是没有得到满意的答复。因此,尽管我会在这里清楚地提出所有细节的问题,以便其他陷入类似情况的人都可以轻松进行工作。

需要:我有一个使用单个UIDatePicker更新的出发和返回文本字段。我想将所选日期保存在我的Parse.com数据库中。我可以查询和过滤数据。如果可能,我也想在解析中存储本地时区。我正在检查天数,但这与该问题无关,因此不包括该代码。

成功与问题:我能够以String格式保存正确的日期和时间,但是当我尝试使用下面的代码以NSDate格式保存时,我得到了错误的时间。

例如:我的日期选择和解析中存储的结果如下:

出发日期:日期选择器选择:2015年5月1日上午01:00 +0530解析中的存储日期:2015年4月30日,19:30

返回日期:日期选择器选择:2015年5月2日01:00 AM +0530解析中的存储日期: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定义为类型“ Date”]

仅供参考:我正在使用平台-iOS Swift(xcode 6.3,swift 1.2)数据库后端= Parse.com

ios swift parse-platform
2个回答
0
投票
您可以在Parse数据库中添加一个额外的字段,并在其中存储本地时区。在检索数据时,您可以使用该信息来解释所引用区域中的日期。

取决于您存储的数据类型,始终可以以用户本地时区解释日期,即使该日期已更改也可以。如果保存的时区和用户时区不同(因此用户已移动),您也可以要求用户提供解决方案。


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

希望这会有所帮助!

© www.soinside.com 2019 - 2024. All rights reserved.