【发布时间】:2019-12-16 00:34:29
【问题描述】:
我有
FieldValue.serverTimestamp()
我找不到在 Flutter 中将此时间戳转换为 DateTime 对象的方法。有什么办法吗?或者任何其他使用 firebase 的 API 调用?
【问题讨论】:
标签: firebase flutter dart google-cloud-firestore
我有
FieldValue.serverTimestamp()
我找不到在 Flutter 中将此时间戳转换为 DateTime 对象的方法。有什么办法吗?或者任何其他使用 firebase 的 API 调用?
【问题讨论】:
标签: firebase flutter dart google-cloud-firestore
好的,这在 我的情况 中是一种解决方法。我正在使用 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;
}
}
我希望它有用。
【讨论】:
如果您的文档中有serverTimeStamp 字段,您可以将其转换为DateTime,如下所示;
final DateTime dateTimeFromServerTimeStamp =
(documentSnapshot.data()['serverTimeStamp'] as Timestamp).toDate();
【讨论】:
as Timestamp。只需在其后面加上toDate() 即可。您的 IDE 直到在运行时才知道它会工作,因此不会为您自动完成它,但它仍然可以工作。
假设您在 firebase 中使用了 serverTimeStamp,并且您正在读取它,您可以使用 DateTime.parse() 从 firebase 读取时间戳:
DateTime timestamp = DateTime.parse( json['ts'].toString() );
【讨论】:
.toDate() 完全相同......只是更复杂! :p
FieldValue.serverTimestamp() 不是时间戳,而是所谓的哨兵——一个被发送到服务器的标记,服务器随后识别并解释它以写入当前时间戳。这意味着无法将FieldValue.serverTimestamp() 转换为客户端上的时间戳。
您可以做的是写入 FieldValue.serverTimestamp() 到服务器上的文档,并观察写入该文档的值。该值将是一个有效的时间戳。
【讨论】: