【问题标题】:How to deal with [NSDate] and Firebase如何处理 [NSDate] 和 Firebase
【发布时间】:2016-07-28 08:57:00
【问题描述】:

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

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

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

【问题讨论】:

  • 为什么不使用时间戳?
  • 哦,我不太熟悉它的工作原理。如何从选定的日期制作输出 NSDate 的印章?
  • 您可以使用dateWithTimeIntervalSince1970:timeIntervalSinceReferenceDate 转换NSDate 和NSTimeInterval (double)(反之亦然),并将双精度值存储在FireBase 中。
  • 第一次看到这个功能。当用户点击我日历上的某个日期时,它会输出 NSDate,并且在处理点击日期的那个函数中,我必须使用 dateWithTimeIntervalSince1970 然后将其存储到 Firebase。你能解释一下这是如何工作的吗?
  • 我们保存日期的方式实际上是自 1970 年 1 月 1 日以来的时间(以秒为单位)。 NSDate 只是一个可以轻松处理它们的对象(因为它比1460036331 for 2016-04-07T13:38:51+00:00 更具可读性)。我不使用 FireBase,但我想它可以存储 double。所以这可能是一种方法。

标签: swift firebase nsarray firebase-realtime-database


【解决方案1】:

从双重中获取日期:

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

反过来,从日期获得双倍:

interval = date.timeIntervalSince1970

【讨论】:

    【解决方案2】:

    答案真的取决于你如何使用你的约会对象。

    “数字”不能存储在 Firebase 中;任何数值首先会(通过 Firebase)转换为 NSNumber 进行存储。见Understanding Data

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

    2016-04-06

    足够了,但其他时候你可能需要更多

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

    最重要的是:保持一致。不管你怎么做,每次在你的代码中都以同样的方式做。

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

    这是一个更好的结构

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

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

    【讨论】:

    • 我决定将它们存储为一个字符串,我发现很酷的 cocoapod 可以轻而易举地操纵日期,所以现在我正在玩它。如果 Firebase 接受 NSDates,这将非常容易 :)
    • 如果您喜欢我将它们存储为字符串的建议,请接受答案!
    • 嘿@KiraArik 你能告诉我那个吊舱是什么吗?谢谢!
    • Google for SwiftDate
    【解决方案3】:

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

    2012-04-23T18:25:43.511Z

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

    The "right" JSON date format

    【讨论】:

      【解决方案4】:

      斯威夫特 4:

      终于想通了。

      将此保存到火力基地

      let date = DateFormatter.localizedString(from: Date(), dateStyle: .short, timeStyle: .none)
      

      根据需要更改 dateStyle 和 timeStyle

      将变量日期保存到 firebase 数据库

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-01-16
        • 1970-01-01
        • 1970-01-01
        • 2016-02-14
        相关资源
        最近更新 更多