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

时间:2015-05-04 00:52:18

标签: firebase angularfire

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

<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 个答案:

答案 0 :(得分:24)

遗憾的是,您没有包含初始化OpenDate属性的代码。但您似乎正在尝试将JavaScript Date对象写入Firebase。 Firebase documentation指定它支持以下类型:

  

object,array,string,number,boolean或null

要存储Date的值,您必须将其转换为支持的类型。 E.g。

$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(), 

答案 1 :(得分:15)

我只是想抛弃一个可能更强大的解决方案,这对于那些关心时区的人来说可能是有用的。

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

Firebase文档声明'Strings [...] are sorted lexicographically in ascending order.',因此只要您处理正年,您就可以在保持时区信息的同时进行高级时间搜索。