尝试在 Flutter 中将 Firestore 时间戳转换为 DateTime 时总是出现错误,尝试了所有解决方案,但都不起作用(上次尝试如何将 Firestore 时间戳打印为格式化的日期和时间)
下面是我的代码;
代码
factory UserModel.fromMap(Map<String, dynamic> map) {
return UserModel(
name: map['name'],
email: map['email'],
username: map['username'],
registerDate:
DateTime.fromMillisecondsSinceEpoch(map['registerDate'] * 1000),
id: map['id'],
imageUrl: map['imageUrl'],
cvUrl: map['cvUrl'],
phoneNumber: map['phoneNumber'],
education: Education.fromMap(map['education']),
location: Location.fromMap(map['location']),
lookingForIntern: map['lookingForIntern'],
);
}
错误
'Timestamp' has no instance method '*'.
Receiver: Instance of 'Timestamp'
将日期时间转换为时间戳,并更改
registerDate:
DateTime.fromMillisecondsSinceEpoch(map['registerDate'] * 1000),
到
registerDate:map['registerDate']
现在出现以下错误;
Converting object to an encodable object failed: Instance of 'Timestamp'
但是
print(map['registerDate'])
打印Timestamp(seconds=1632412800, nanoseconds=0)
尝试这个包来解决问题-
https://pub.dev/packages/date_format
import 'package:date_format/date_format.dart';
DateTime datetime = stamp.toDate();
var time = formatDate(datetime, [hh, ':', nn, ' ', am]);
我有这个 firebase 函数,它在字段中返回时间戳 (
admin.firestore.Timestamp
) dueDateLatestRental
:
return {
data: { 'rental': null, 'hash': null, 'dueDateLatestRental': dueDateLatestRental },
status: 403,
message: itemStatus
在我的 flutter 代码中,我像这样解析时间戳:
try {
dynamic dueDateLatestRental = result.data['data']['dueDateLatestRental'];
final data = Map<String, dynamic>.from(dueDateLatestRental) as Map<String, dynamic>;
DateTime dueDateLatestRentalString = DateTime.fromMillisecondsSinceEpoch(data['_seconds'] * 1000).toLocal();
String formattedDueDate = formatDate(dueDateLatestRentalString, [dd, '.', mm, '.', yyyy, ' ', HH, ':', nn]);
logger.i('addRental result: $formattedDueDate');
QuickAlert.show(
context: context,
type: QuickAlertType.error,
title: 'Nicht verfügbar',
text:
'Das Teil ist bis zum $formattedDueDate ausgeliehen.',
confirmBtnText: 'Okay',
onConfirmBtnTap: () async {
log("Box was not opened");
Navigator.pop(context);
},);
return null;
} catch (e) {
logger.e("Error: could not parse the dueDateLatestRental");
QuickAlert.show(
context: context,
type: QuickAlertType.error,
title: 'Nicht verfügbar',
text:
'Das Teil ist bereits ausgeliehen. Bitte warte ein paar Tage.',
confirmBtnText: 'Okay',
onConfirmBtnTap: () async {
log("Box was not opened");
Navigator.pop(context);
},
);
return null;
}
我认为将其包装在
try/catch
中更安全,因为随着时间的推移,这可能会通过多种方式停止(例如,我更改数据库结构中的某些内容)
这是生成的警报对话框:
根据不同的场景,可以有不同的方法来实现这一点,看看以下哪个代码适合您的场景。
map['registerDate'].toDate()
(map["registerDate"] as Timestamp).toDate()
DateTime.fromMillisecondsSinceEpoch(map['registerDate'].millisecondsSinceEpoch);
Timestamp.fromMillisecondsSinceEpoch(map['registerDate'].millisecondsSinceEpoch).toDate();
在 dart 文件中添加以下函数。
String formatTimestamp(Timestamp timestamp) {
var format = new DateFormat('yyyy-MM-dd'); // <- use skeleton here
return format.format(timestamp.toDate());
}
称其为
formatTimestamp(map['registerDate'])
datetime 是存储服务器当前时区的。时间戳类型是把服务器当前时间转换为UTC(世界时间)进行存储
您可以将 Firestore 文档参数类型设置为 int
@JsonKey(fromJson: timeFromJson, toJson: timeToJson)
DateTime fileCreateTime;
static DateTime timeFromJson(int timeMicroseconds) =>
Timestamp.fromMicrosecondsSinceEpoch(timeMicroseconds).toDate().toLocal();
static int timeToJson(DateTime date) =>
Timestamp.fromMillisecondsSinceEpoch(date.toUtc().millisecondsSinceEpoch)
.microsecondsSinceEpoch;
对于未来的搜索者:
对于 Timestamp
t
,t.toDate()
有效,但是当我尝试使用自定义的 DateTime 扩展时,我自己遇到了一些奇怪的问题。经过一些测试才弄清楚,但可以通过直接转换来解决,即 t.toDate() as DateTime
应该可以工作。
就我而言,对于日期时间的扩展
isToday
:
debugPrint(myTimestamp.toDate().isToday.toString());
抛出“类‘DateTime’没有实例 getter ‘isToday’”
但是
debugPrint(myTimestamp.toDate() as DateTime).isToday.toString());
效果完美。