Firebase日期与时间戳

osh3o9ms  于 2023-06-24  发布在  其他
关注(0)|答案(1)|浏览(112)

我正在使用Ionic v6和Angular构建一个应用程序,使用Firebase Firestore作为云数据存储。我已经定义了一个带有'Date'对象的接口:

export interface PuzzleInfo {
       puzzleAnswers: string[];
       puzzleTitle: string;
       deployed: boolean;
       deployDate: Date;
       status?: string;
    }

当数据被写入Firestore时,它被“转换”为[秒,纳秒]的时间戳类型。然后,当我将数据读回同一个对象定义时,'deployDate'不能作为Date类型使用;一个控制台日志显示'无效日期',我不能在上面使用任何日期方法/函数。即使数据类型是“Date”,从DB输入的项目的实际内容对于Date无效。
我创建了一个模仿Firestore数据类型的Timestamp接口

export interface Timestamp {
   seconds: number;
   nanoseconds: number;
}

然后,在我的TS代码中,我将传入的对象转换/转换为timestamp对象,然后再转换回日期:

public puzzle: PuzzleInfo[]

<< read data from Firestore >>
const fbTimestamp = this.puzzle.deployDate as unknown as Timestamp;
this.depDate = new Date(fbTimestamp.seconds * 1000).toISOString();

这给了我在const fbTimestamp中所需要的内容,然后我就可以只访问一个Date中的秒部分。有没有更简单/更好的方法来做到这一点?我没有直接将Date对象转换为FB Timestamp对象;我可以告诉FB为我做了这些。有没有办法阻止这种转变?我知道我可以将deployDate设置为字符串,并将其作为字符串存储在DB中,然后来回转换。
虽然这是可行的,但它确实看起来非常复杂,在未来容易出错。
想法?

db2dz4w8

db2dz4w81#

有没有更简单/更好的方法来做到这一点?
以你现在定义数据的方式,不是真的。数据类型转换在数据库中非常常见。这并不像你想象的那么糟糕--你肯定会在应用程序的其他部分遇到更困难和更有问题的事情。只需编写一个数据转换器函数,并在需要时使用它。如果你对功能进行了单元测试,就不容易出错。Firestore甚至有一个TypeScript API来实现这一点:FirestoreDataConverter
有没有办法阻止这种转变?
不完全是,只要你使用的是Date对象。如果你的代码中一定要有一个Date对象,那么每次你想读写的时候,你都要转换它。你可能会有一个更好的时间使用一个数字,而不是日期,然后转换该数字只有当你绝对需要从它派生的其他东西。如果你计划得好,你甚至可能根本不需要约会。
对于日期类型使用字符串通常是一个坏主意,除非您希望提交到具有方便转换器的ISO格式。

相关问题