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

Lui*_*era 7 firebase angularfire

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

<label class="item item-input">
     <span class="input-label">Start Date</span>
     <input type="date" ng-model="currentItem.OpenDate">
</label>
Run Code Online (Sandbox Code Playgroud)

我将以下内容添加到"保存"按钮的单击事件中

console.log("Normal date " + $scope.currentItem.OpenDate);
Run Code Online (Sandbox Code Playgroud)

控制台显示以下日期

Normal date Fri May 01 2015 00:00:00 GMT-0400 (Eastern Daylight Time)
Run Code Online (Sandbox Code Playgroud)

这是推送活动

$scope.data.accounts.push({ 'AccountName': $scope.currentItem.AccountName, 'StartBalance': $scope.currentItem.StartBalance, 'OpenDate': $scope.currentItem.OpenDate, 'AccountType': $scope.currentItem.AccountType });
Run Code Online (Sandbox Code Playgroud)

但是,日期$scope.currentItem.OpenDate未保存到Firebase,其余数据正在正常保存.我错过了什么?

Fra*_*len 24

遗憾的是,您没有包含初始化OpenDate属性的代码.但看起来您正在尝试将JavaScript Date对象编写到Firebase中.在火力地堡文档指定它支持这些类型:

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

为了存储Date值,您必须将其转换为支持的类型.例如

$scope.data.accounts.push({ 
  'AccountName': $scope.currentItem.AccountName, 
  'StartBalance': $scope.currentItem.StartBalance, 
  'OpenDate': $scope.currentItem.OpenDate.toString(), 
  'AccountType': $scope.currentItem.AccountType 
});
Run Code Online (Sandbox Code Playgroud)

或者:

  'OpenDate': $scope.currentItem.OpenDate.getTime(), 
Run Code Online (Sandbox Code Playgroud)

  • 通常,`getTime()`将更通用,更易于使用查询和排序,以及整体更实用的解决方案. (2认同)

art*_*art 15

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

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

Firebase文档声明'字符串[...]按字典顺序按升序排序.,只要您处理积极的年份,您就可以在保持时区信息的同时进行高级时间搜索.