web-dev-qa-db-ja.com

AngularFireを使用してFirebaseにDATEフィールドを保存するにはどうすればよいですか

ユーザーが任意の日付を入力できる日付フィールド(開始日)のある画面があります

<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に保存されておらず、残りのデータは適切に保存されています。何が足りないのですか?

7
Luis Cabrera

残念ながら、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(), 
24

タイムゾーンを気にする人に役立つかもしれない、おそらくもっと堅牢なソリューションを捨てたかっただけです。

有効な解決策は、日付を ISO-8601 形式の文字列として保存することだと思います。リンクされたウィキペディアの記事を読むと、「表現の辞書式順序は、負の年を含む日付表現を除いて、時系列の順序に対応している」ことがわかります。

Firebaseのドキュメントには、 'Strings [...]は辞書式順序で昇順で並べ替えられています。' と記載されています。正の年を扱っている限り、高度な時間検索を実行できます。タイムゾーン情報を維持します。

15
artburkart