如何处理[NSDate]和Firebase

Kir*_*ira 4 nsarray firebase swift firebase-realtime-database

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

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)
Run Code Online (Sandbox Code Playgroud)

我的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)
        })
Run Code Online (Sandbox Code Playgroud)

这输出:

(
    "2016-04-10",
    "2016-04-11",
    "2016-04-12"
)
Run Code Online (Sandbox Code Playgroud)

我认为有一种更好的方式来存储日期,然后进行检索,我希望有人可以帮助我.

Jay*_*Jay 8

答案真的取决于你如何使用你的约会.

"数字"无法存储在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);
Run Code Online (Sandbox Code Playgroud)

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

NSDate *d = [NSDate new];

d = [dateFormat dateFromString:dateString];

NSLog(@"the date %@", d);
Run Code Online (Sandbox Code Playgroud)

最重要的是: 保持一致.无论如何,每次在代码中都以相同的方式执行此操作.

哦 - 另一件事.Array的.应该谨慎使用数组,并且仅在Firebase中的特定用例情况下使用.由于您无法访问特定索引或能够更改,添加或删除单个索引,因此使用它们可能具有挑战性.

这是一个更好的结构

my_dates
    date_0
      date_stamp: 2016-04-06
    date_1
      date_stamp: 2016-04-07
Run Code Online (Sandbox Code Playgroud)

使用childByAutoId生成日期键(date_0,date_1).


Pet*_*ies 7

从双倍中获取日期:

var interval = Double()
var date = NSDate()
date = NSDate(timeIntervalSince1970: interval)
Run Code Online (Sandbox Code Playgroud)

换句话说,从日期开始加倍:

interval = date.timeIntervalSince1970
Run Code Online (Sandbox Code Playgroud)