在 Parse 后端保存日期和时间

Posted

技术标签:

【中文标题】在 Parse 后端保存日期和时间【英文标题】:Saving Date and time in Parse backend 【发布时间】: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 专家对此有何看法。 【参考方案1】:

由于 Parse 存储引用到 GMT 的日期,当您在 parse 时检查它们或检索它们时,您可能会发现与您当地时区的差异。一般来说,日期存储在 GMT 中。

您可以在 Parse 数据库中添加一个额外的字段并将本地时区存储在那里。在检索数据时,您可以使用该信息来解释引用它的区域中的日期。

根据您存储的数据类型,始终以用户本地时区解释日期可能是可以的,即使这已更改。如果保存的时区和用户时区不同(因此用户已移动),您也可以向用户询问解决方案。

【讨论】:

【参考方案2】:

设置日期选择器:

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

希望这会有所帮助!

【讨论】:

以上是关于在 Parse 后端保存日期和时间的主要内容,如果未能解决你的问题,请参考以下文章

无法将 createdAt 和 updatedAt 保存为日期时间值,也无法将后端保存为前端

在Xamarin Forms中将日期时间保存到数据库

[翻译]C#.我该如何分析和转换日期时间的到RFC 822的日期,时间格式(How do I parse and convert DateTi

getTime()和parse()的区别

在前端和后端之间同步日期格式

parse_dates 不适用于默认日期时间格式