无法将 firetstore 时间戳转换为 Flutter DateTime



我无法将firestore时间戳转换为扑动日期,并且确实尝试了几乎所有内容(包括在模型中使用时间戳而不是DateTime),任何想法如何修复此错误。下面这是我的代码

<模型从地图/strong>

factory Event.fromMap(Map<String, dynamic> map) {
return Event(
id: map['id'],
organizerId: map['organizerId'],
organizerName: map['organizerName'],
eventTime: map['eventTime'].toDate(),
maxApplicationCount: map['maxApplicationCount'],
attendedUsers: List<String>.from(map['attendedUsers']),
eventText: map['eventText'],
location: Location.fromMap(map['location']),
);
}

误差

NoSuchMethodError: Class 'int' has no instance method 'toDate'.

使用Timestamp代替DateTime

factory Event.fromMap(Map<String, dynamic> map) {
return Event(
id: map['id'],
organizerId: map['organizerId'],
organizerName: map['organizerName'],
eventTime: map['eventTime'],
maxApplicationCount: map['maxApplicationCount'],
attendedUsers: List<String>.from(map['attendedUsers']),
eventText: map['eventText'],
location: Location.fromMap(map['location']),
);
}

误差

flutter: type 'int' is not a subtype of type 'Timestamp'

任何想法如何转换Firestore时间戳到日期时间?

地图("eventTime")

Timestamp(seconds=1620583200, nanoseconds=0)

你可以让eventTime作为动态的,并尝试eventModel.eventTime.toDate(),无论你使用它

这对我有用。像这样设置和获取时间戳

class EventModel{
dynamic timestamp;
SiteModel({this.deletedTimestamp});
EventModel.fromJson(Map<String, dynamic> json) {
timestamp=json['timestamp'];
}

Map<String, dynamic> toJson() {
final Map<String, dynamic> data =<String, dynamic>{};
data["timestamp"]=FieldValue.serverTimestamp();
return data;
}

像这样使用

eventModel.timestamp.toDate().toString()

我建议使用这个包,它是一个真正的助推器

package link到pub.dev: link

用法要使用MapDescriptor包,只需导入它并创建MapDescriptor类的新实例:

import 'package:map_descriptor/map_descriptor.dart';
MapDescriptor mapDescriptor = MapDescriptor();

**转换时间戳va

lues to ISO 8601 strings**
To convert TimeStamp values in a map to ISO 8601 strings, use the convertTimeStampToStr method:
Map<String, dynamic> myMap = {
'date1': TimeStamp(2124545,6565457),
'date2': {'date3': TimeStamp(1212154,121215545)}
};
Map<String, dynamic> result = mapDescriptor.convertTimeStampToStr(myMap);
print(result);
// output: {date1: 2023-04-24T16:47:36.975, date2: {date3: 2023-04-24T16:47:36.975}}

将ISO 8601字符串转换为时间戳值

要将map中的ISO 8601字符串值转换为TimeStamp对象,请使用convertStrToTimeStamp方法:

Map<String, dynamic> myMap = {
'date1': '2023-04-24T16:47:36.975',
'date2': {'date3': '2023-04-24T16:47:36.975'}
};
Map<String, dynamic> result = mapDescriptor.convertStrToTimeStamp(myMap);
print(result);
// output: {date1: Timestamp(seconds=1685065656, nanoseconds=975000000), date2: {date3: Timestamp(seconds=1685065656, nanoseconds=975000000)}}

检查时间戳或ISO 8601字符串值

要确定一个映射是否包含任何TimeStamp或ISO8601字符串值,分别使用containsTimeStamp和containsISO8601Str方法:

Map<String, dynamic> myMap1 = {'date1': TimeStamp(4545412,2121454)};
Map<String, dynamic> myMap2 = {'date1': {'date3': TimeStamp(412115,121244)}, 'date2': {'date3': '2023-04-24T16:47:36.975'}};
bool containsDateTime1 = mapDescriptor.containsTimeStamp(myMap1); // true
bool containsDateTime2 = mapDescriptor.containsTimeStamp(myMap2); // false
bool containsISO8601Str1 = mapDescriptor.containsISO8601Str(myMap1); // false
bool containsISO8601Str2 = mapDescriptor.containsISO8601Str(myMap2); // true
Storing the map to the persistent storage
Future setMap(
String key,
Map<String, dynamic> myMap,
) async {
await initializePrefs();
//delete the previous data to prevent error
await prefs!.setString(key, jsonEncode({}));
if (MapDescriptor().containsTimeStamp(myMap)) {
myMap = MapDescriptor().convertTimeStampToStr(myMap);
}
//now we can use jsonEncode for myMap 
// if we kept myMap without converting TimeStamp values
// the code will throw an error that the method .toJson() is not allowed
// for TimeStamp values
return await prefs!.setString(key, jsonEncode(myMap));
}

如果myMap参数包含时间戳(由MapDescriptor类的containsTimeStamp方法确定),则调用MapDescriptor类的convertTimeStampToStr方法将时间戳转换为字符串。

最后,myMap参数是json编码的,并使用prefs实例的setString方法使用指定的键保存到持久存储中。

总的来说,这个函数使用SharedPreferences将键值对的映射保存到持久存储。如果映射包含时间戳,则在保存之前将其转换为字符串。

在保存新数据之前,将删除先前与指定键关联的数据。

最新更新