如何使用AngularFire将DATE字段保存到Firebase中

7

我有一个屏幕上带有一个日期字段(开始日期),用户可以输入任何日期。

<label class="item item-input">
     <span class="input-label">Start Date</span>
     <input type="date" ng-model="currentItem.OpenDate">
</label>

我在保存按钮的点击事件中添加了以下内容。
console.log("Normal date " + $scope.currentItem.OpenDate);

控制台显示以下日期。
Normal date Fri May 01 2015 00:00:00 GMT-0400 (Eastern Daylight Time)

这是推送事件。
$scope.data.accounts.push({ 'AccountName': $scope.currentItem.AccountName, 'StartBalance': $scope.currentItem.StartBalance, 'OpenDate': $scope.currentItem.OpenDate, 'AccountType': $scope.currentItem.AccountType });

然而,日期$scope.currentItem.OpenDate没有被保存到Firebase中,其余的数据都保存正常。我漏掉了什么?

2个回答

24
抱歉,您未包含初始化OpenDate属性的代码。但是看起来您正试图将JavaScript Date对象写入Firebase。 Firebase文档指定它支持以下这些类型:

对象、数组、字符串、数字、布尔值或者null

为了存储Date的值,您需要将其转换为支持的类型。例如:
$scope.data.accounts.push({ 
  'AccountName': $scope.currentItem.AccountName, 
  'StartBalance': $scope.currentItem.StartBalance, 
  'OpenDate': $scope.currentItem.OpenDate.toString(), 
  'AccountType': $scope.currentItem.AccountType 
});

或者,另一种选择是:

  'OpenDate': $scope.currentItem.OpenDate.getTime(), 

2
一般来说,getTime() 更加通用,更易于在查询和排序中使用,并且总体上是一个更加实用的解决方案。 - Kato
那对我有用。非常感谢你。有时候成为新手并不好玩,但必须向前迈进! - Luis Cabrera
@Kato 同意,我正在搜索日期范围查询。 - Zaid Mirza

14

我想提出一个可能更加强大的解决方案,可能对那些关心时区的人有用。

我认为一种有效的解决方案是将日期存储为ISO-8601格式的字符串。 如果您阅读链接的维基百科文章,您将看到“表示的词典顺序与时间顺序相对应,除了涉及负年份的日期表示以外。”

Firebase文档指出,“字符串按字典顺序升序排序”,因此只要处理正年份,您就可以在保留时区信息的同时进行高级时间搜索。


1
太棒了。你的答案兼顾了可读性和功能性,而不像Frank建议的那样牺牲可读性! - gustavohenke

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接