如何处理[NSDate]和Firebase

我正在制作日历应用。 我有一个选定的日期数组。 用户以前选择了它们并将它们存储在那里。

var selectedDays = [NSDate]()

当应用程序加载时,我必须显示这些日期,但一切都过于复杂,因为Firebase不接受NSDate

我有另一个数组var selectedDaysForFirebase = [String]() ,它与上面的数组相同,只有日期转换为字符串以容纳Firebase。

这是我保存选定日期的方式:

// 1. Append converted date into selectedDaysForFirebase array
            let day = dateFormatter.stringFromDate(date)
            selectedDaysForFirebase.append(day)

// 2. Push data to Firebase
            ref.childByAppendingPath("dates").setValue(selectedDaysForFirebase)

我的Firebase具有用户身份验证。 所以每个用户都有自己的带日期的小数据库。

在我的viewDidLoad我必须从Firebase中获取日期数组,并将其存储在我的selectedDates数组中,该数组接受NSDate

ref.childByAppendingPath("dates").observeEventType(.Value, withBlock: { snapshot in

        if let dates = snapshot.value as? NSArray {
             print(dates)
             // convert firebase array of dates with array of dates that only accepts NSDate
        }

        }, withCancelBlock: { error in
             print(error.description)
        })

这输出:

(
    "2016-04-10",
    "2016-04-11",
    "2016-04-12"
)

我认为有一个更好的方法来存储日期,然后检索它,我希望有人可以帮助我。


答案真的取决于你如何使用你的日期。

'数字'不能存储在Firebase中; 任何数值首先被转换(通过Firebase)到NSNumber进行存储。 请参阅了解数据

您需要确定如何使用日期以及需要多大的粒度。 在某些情况下

2016年4月6日

已经够了,但有时你可能需要更多

2016-04-06 14:00:00

我建议简单地将它们存储为字符串,因为它们是可排序的,易于操作,并且可以引入NSDate对象或从NSDate对象中取出。

以下是一些将NSDate转换为格式化字符串的示例代码,类似于时间戳,然后可以将它作为字符串存储在Firebase中。

NSDateFormatter *dateFormat = [NSDateFormatter new];
[dateFormat setDateFormat: @"yyyy-MM-dd HH:mm:ss zzz"];

NSString *dateString = [dateFormat stringFromDate:[NSDate date]];

NSLog(@"%@",dateString);

另一种方式是从格式化的字符串到NSDate

NSDate *d = [NSDate new];

d = [dateFormat dateFromString:dateString];

NSLog(@"the date %@", d);

最重要的是:保持一致。 但是,您可以每次在代码中以相同的方式执行此操作。

哦 - 另一件事。 Array的。 数组应该谨慎使用,并且只能在Firebase的特定用例情况下使用。 由于您无法访问特定索引或者无法更改,添加或删除单个索引,因此它们可能很难处理。

这是一个更好的结构

my_dates
    date_0
      date_stamp: 2016-04-06
    date_1
      date_stamp: 2016-04-07

日期键(date_0,date_1)是用childByAutoId生成的。


从双倍获得日期:

var interval = Double()
var date = NSDate()
date = NSDate(timeIntervalSince1970: interval)

其他方式,从日期获得双倍:

interval = date.timeIntervalSince1970

由于firebase是一个文档数据库,基于json强烈建议使用ISO 8601格式的日期时间。 这是一种格式,如:

2012-04-23T18:25:43.511Z

在这篇文章中,你可以找到一个很好的解释:

“正确”的JSON日期格式

链接地址: http://www.djcxy.com/p/46667.html

上一篇: How to deal with [NSDate] and Firebase

下一篇: How use a specific CultureInfo in Asp.net Web API