Flutter:Firebase FieldValue.serverTimestamp() 到 DateTime 对象
Posted
技术标签:
【中文标题】Flutter:Firebase FieldValue.serverTimestamp() 到 DateTime 对象【英文标题】:Flutter: Firebase FieldValue.serverTimestamp() to DateTime object 【发布时间】:2019-12-16 00:34:29 【问题描述】:我有
FieldValue.serverTimestamp()
我找不到在 Flutter 中将此时间戳转换为 DateTime
对象的方法。有什么办法吗?或者任何其他使用 firebase 的 API 调用?
【问题讨论】:
【参考方案1】:好的,这在 我的情况 中是一种解决方法。我正在使用 json_annotation、json_serilaizable、build_runner。
这些是库版本:
json_serializable: ^5.0.2
build_runner: ^2.1.2
json_annotation: ^4.1.0
part 'podcast_comment_model.g.dart';
@JsonSerializable()
class CommentModel extends BaseModel
final String? id;
final String podcastId;
final String? comment;
@JsonKey(
fromJson: ServerTimestampConverter.fromJson,
toJson: ServerTimestampConverter.toJson,
)
Object? dueDate;
final CreatorModel? creator;
CommentModel(
required this.id,
required this.podcastId,
this.comment,
this.creator,
this.dueDate,
);
factory CommentModel.fromJson(Map<String, dynamic> json)
return _$CommentModelFromJson(json);
Map<String, dynamic> toJson() => _$CommentModelToJson(this);
@override
CommentEntity toEntity()
return CommentEntity(
id: this.id,
podcastId: this.podcastId,
dueDate: ServerTimestampConverter.fromJson(this.dueDate),
creator: this.creator?.toEntity(),
comment: this.comment,
);
class ServerTimestampConverter
static DateTime? fromJson(Object? json)
if (json is Timestamp)
return json.toDate();
return null;
static Object? toJson(Object? fieldValue)
print('toJson is FieldValue fireStore object $fieldValue');
return fieldValue as FieldValue;
我希望它有用。
【讨论】:
【参考方案2】:如果您的文档中有serverTimeStamp
字段,您可以将其转换为DateTime
,如下所示;
final DateTime dateTimeFromServerTimeStamp =
(documentSnapshot.data()['serverTimeStamp'] as Timestamp).toDate();
【讨论】:
如果你已经知道它是一个时间戳,我发现你甚至不必写as Timestamp
。只需在其后面加上toDate()
即可。您的 IDE 直到在运行时才知道它会工作,因此不会为您自动完成它,但它仍然可以工作。【参考方案3】:
假设您在 firebase 中使用了 serverTimeStamp,并且您正在读取它,您可以使用 DateTime.parse() 从 firebase 读取时间戳:
DateTime timestamp = DateTime.parse( json['ts'].toString() );
【讨论】:
似乎与在下载的 Timestamp 变量后添加.toDate()
完全相同......只是更复杂! :p
你每天都在学习新功能!
不是这样吗……! ?【参考方案4】:
FieldValue.serverTimestamp()
不是时间戳,而是所谓的哨兵——一个被发送到服务器的标记,服务器随后识别并解释它以写入当前时间戳。这意味着无法将FieldValue.serverTimestamp()
转换为客户端上的时间戳。
您可以做的是写入 FieldValue.serverTimestamp()
到服务器上的文档,并观察写入该文档的值。该值将是一个有效的时间戳。
【讨论】:
谢谢 Puf,您能否为此类工作推荐一个免费的 API? Google NTP可以用吗,我还想不通。任何建议将不胜感激。 我在那里没有任何建议(它们也与 Stack Overflow 无关)。我想任何时候可以满足您的目的的服务器都可以。以上是关于Flutter:Firebase FieldValue.serverTimestamp() 到 DateTime 对象的主要内容,如果未能解决你的问题,请参考以下文章
没有创建 Firebase 应用“[DEFAULT]” - 在 Flutter 和 Firebase 中调用 Firebase.initializeApp()
用于 Flutter 桌面嵌入的 Firebase 身份验证插件