在Parse后端保存日期和时间

时间:2015-04-19 04:48:09

标签: ios swift parse-platform

我搜索过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

2 个答案:

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

希望这会有所帮助!