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

问题描述 投票:0回答:5

尝试在 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)

firebase flutter google-cloud-firestore
5个回答
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]);

0
投票

我有这个 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
中更安全,因为随着时间的推移,这可能会通过多种方式停止(例如,我更改数据库结构中的某些内容)

这是生成的警报对话框:

result


0
投票

根据不同的场景,可以有不同的方法来实现这一点,看看以下哪个代码适合您的场景。

  1. map['registerDate'].toDate()
    
  2. (map["registerDate"] as Timestamp).toDate()
    
  3. DateTime.fromMillisecondsSinceEpoch(map['registerDate'].millisecondsSinceEpoch);
    
  4. Timestamp.fromMillisecondsSinceEpoch(map['registerDate'].millisecondsSinceEpoch).toDate();
    
  5. 在 dart 文件中添加以下函数。

    String formatTimestamp(Timestamp timestamp) {
      var format = new DateFormat('yyyy-MM-dd'); // <- use skeleton here
      return format.format(timestamp.toDate());
    }
    

    称其为

    formatTimestamp(map['registerDate'])


0
投票
  • 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;

0
投票

对于未来的搜索者:

对于 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());
效果完美。

© www.soinside.com 2019 - 2024. All rights reserved.