【问题标题】:How to print Firestore timestamp as formatted date and time如何将 Firestore 时间戳打印为格式化的日期和时间
【发布时间】:2019-10-30 20:17:17
【问题描述】:

我的时间戳在 Flutter Firestore 快照中返回 Timestamp(seconds=1560523991, nanoseconds=286000000)

我想将其打印为格式正确的日期和时间。

我使用DateTime.now() 将当前日期时间存储在 Firestore 中,同时创建新记录并使用 Firestore 快照检索它,但我无法转换为格式化的日期时间。我正在使用 lib intl.dart 进行格式化。

保存数据的代码

       d={'amount':amount,
      'desc':desc,
      'user_id':user_id,
      'flie_ref':url.toString(),
      'date':'${user_id}${DateTime.now().day}-${DateTime.now().month}-${DateTime.now().year}',
      'timestamp':DateTime.now()
return Firestore.instance.collection('/data').add(d).then((v){return true;
    }).catchError((onError)=>print(onError));
    });

Accessing with 

    FutureBuilder(
                  future: Firestore.instance
                      .collection('data')
                      .where('user_id', isEqualTo:_user_id)
                      .getDocuments(),
                  builder: (BuildContext context,
                      AsyncSnapshot<QuerySnapshot> snapshot) {
                    if (!snapshot.hasData)
                      return Container(
                          child: Center(child: CircularProgressIndicator()));
                    return ListView.builder(
                        itemCount: snapshot.data.documents.length,
                        itemBuilder: (BuildContext context, int index) {
                          return Column(
                            children: <Widget>[
       Text(DateFormat.yMMMd().add_jm().format(DateTime.parse(snapshot.data.documents[index].data['timestamp'].toString())]);


....

抛出的错误是

日期格式无效。

我期望输出是:'Jan 17, 2019, 2:19 PM'

【问题讨论】:

标签: time flutter dart google-cloud-firestore


【解决方案1】:

使用intl 包:

Timestamp firebaseTimestamp = ...;
var date = firebaseTimestamp.toDate();

var output1 = DateFormat('MM/dd, hh:mm a').format(date); // 12/31, 10:00 PM
var output2 = DateFormat.yMMMd().format(date); // Dec 31, 2000

【讨论】:

    【解决方案2】:
    Timestamp t = document['time'] // Timestamp(seconds=1624653319,nanoseconds=326000000)
    DateTime d = t.toDate();
    print(d.toString()); //2021-06-25 18:48:48.364
    

    【讨论】:

    • 给出一些描述来解释你的代码。看看How to answer
    • 虽然此代码可能会回答问题,但提供有关此代码为何和/或如何回答问题的额外上下文可提高其长期价值。
    【解决方案3】:

    我发现 Ashutosh 的建议提供了更多用户友好的输出。建议在具有静态方法的辅助类中使用这样的函数。

      static convertTimeStamp(Timestamp timestamp) {
        assert(timestamp != null);
        String convertedDate;
        convertedDate = DateFormat.yMMMd().add_jm().format(timestamp.toDate());
        return convertedDate;
      }
    

    Intl 需要 DateFormat 包。

    【讨论】:

      【解决方案4】:

      花了很长时间才找到完美的答案。 当您从 Firestore 作为 Timestamp 对象获取数据并且您确定这一点时,我建议您使用以下代码:

      DateTime fetchedDate = e.data()["deadline"]?.toDate();
      

      使用?.toDate() 对我有用,希望也对你有用。

      【讨论】:

        【解决方案5】:

        使用 Cloud Firestore,这对我有用:

        Text(snapshot.data["YouKey"].toDate().toString().substring(0,16))
        

        subString 是可选的,我添加了它,因为我的时钟时间在分钟后有很多数字(比如 12:00 00:00:00)

        【讨论】:

          【解决方案6】:

          解决它的简单方法。

          //声明一个变量Timestamp,并从数据库中赋值timestamp

          Timestamp timestamp = document['timeFieldName'];
          

          //使用DateTime的parse方法转回DateTime

          DateTime _time =DateTime.parse(timestamp.toDate().toString())
          

          //使用该方法获取DateTime的H:m。 //你可以选择你想要的DateFormat

          String readTimeStamp(DateTime date)
            {
              
               var format =new DateFormat.Hm(); // My Format 08:00
          
               return format.format(date);
            }
          

          【讨论】:

            【解决方案7】:

            你应该使用 fromMillisecondsSinceEpoch 函数。

            var d = new DateTime.fromMillisecondsSinceEpoch(ts, isUtc: true);
            

            这里 ts 是 int 类型。

            所以我们可以将 Firebase timestamps 转换为 DateTime 对象,如下所示。

            DateTime date = DateTime.fromMillisecondsSinceEpoch(timestamp.seconds * 1000);
            

            【讨论】:

              【解决方案8】:

              一旦您从 Firestore 获得 时间戳,类似于

              时间戳(秒=1560523991,纳秒=286000000)

              您需要将其解析为 DateTime 类型的对象:

              DateTime myDateTime = DateTime.parse(timestamp.toDate().toString());

               print('$myDateTime');
              

              这会给你类似的东西:

              2020-05-09 15:27:04.074

              然后您可以像这样格式化 myDateTime:

              String formattedDateTime =
                        DateFormat('yyyy-MM-dd – kk:mm').format(myDateTime);
              
              print('$formattedDateTime');
              

              这会给你:

              2020-05-09 – 15:27

              【讨论】:

                【解决方案9】:

                首次访问here 获取国际包, 然后将包粘贴到您的 pubspec.yaml 中,运行 pub get(更新 pubspec 的常用方法)。将包导入 dart 文件并尝试以下方法。

                String timestamp;
                
                DateTime now = DateTime.now();
                String formatDate =
                    DateFormat('yyyy-MM-dd – kk:mm').format(now);
                timestamp = formatDate;
                

                【讨论】:

                  【解决方案10】:

                  您可以像这样直接将 Firestore 时间戳对象转换为 DateTime:

                  DateTime myDateTime = (snapshot.data.documents[index].data['timestamp']).toDate();
                  

                  这将以 dart 的 DateTime 格式返回您的 Firestore 时间戳。为了转换您的DateTime 对象,您可以使用intl 包中的DateFormat 类。 您可以使用获得的 DateTime 对象来获取您选择的格式,如下所示:

                  DateFormat.yMMMd().add_jm().format(myDateTime);
                  

                  此代码产生如下输出:

                  Apr 21, 2020 5:33 PM
                  

                  【讨论】:

                    【解决方案11】:

                    这就是方法!

                    Firestore 将像 Timestamp(seconds=1560523991, nanoseconds=286000000) 一样返回 TimeStamp。

                    这可以解析为

                    Timestamp t = document['timeFieldName'];
                    DateTime d = t.toDate();
                    print(d.toString()); //2019-12-28 18:48:48.364
                    

                    【讨论】:

                    • .toDate() 是一个时间戳函数。时间戳由 Firebase cloud firestore 提供,而不是默认的颤振材料。尝试通过 import 'package:cloud_firestore/cloud_firestore.dart';
                    • getDateTimeFromTimestamp(int timestampInSeconds) { var date = DateTime.fromMillisecondsSinceEpoch(timestampInSeconds * 1000);归期; } DateTime lastPostedMessageOnDateTime = getDateTimeFromTimestamp(document['timeFieldName'].seconds);它对我有用。谢谢。
                    【解决方案12】:

                    这样做:

                    DateFormat.yMMMd().add_jm().format(DateTime.parse(snapshot.data.documents[index].data['timestamp'].toDate().toString())]
                    

                    【讨论】:

                    【解决方案13】:

                    当我们将 DateTime 对象推送到 Firestore 时,它​​会在内部将其转换为它自己的 timestamp 对象并存储它。

                    从 Firestore 获取时间戳后将其转换回 Datetime 的方法:

                    Firestore 的 timestamp 包含一个名为 toDate() 的方法,该方法可以转换为字符串,然后可以将该字符串传递给 DateTimeparse 方法转换回 DateTime

                    DateTime.parse(timestamp.toDate().toString())
                    

                    【讨论】:

                    • 我认为我们不需要先将timestamp.toDate()转换为字符串,然后解析字符串得到实际的DateTime。你可以简单地做 timestamp.toDate()。它已经返回了 DateTime。
                    • “解析”不存在...?我这样做了 - myDate = DateFormat('dd-MMM-yy ~ HH:mm').format(data['itemDate'].toDate()).toString(),
                    【解决方案14】:

                    timestamp 参数是以秒为单位的时间

                    String formatTimestamp(int timestamp) {
                          var format = new DateFormat('d MMM, hh:mm a');
                          var date = new DateTime.fromMillisecondsSinceEpoch(timestamp * 1000);
                          return format.format(date);
                        }
                    

                    请查看this 国际日期格式的答案

                    希望对你有帮助!

                    【讨论】:

                    • for formatTimestamp() 传递我没有得到 int 类型的数据,我得到的数据是 Timestamp(seconds=1560523991, nanoseconds=286000000) 这种格式
                    【解决方案15】:

                    即使您将 DateTime 发送到 firestore,您也会从 firestore 获得 unix 时间戳。

                    您可以使用 DateTime.fromMillisecondsSinceEpoch(timestamp * 1000); 从 Firestore 解析 DateTime

                    DateTime 类有两个返回字符串的选项。 toIso8601String()toString() 选择你需要的那个。或使用例如。 DateTime.now().hour;获取我们的并创建您自己的输出。

                    更多信息:查看https://api.dartlang.org/stable/2.4.0/dart-core/DateTime-class.html

                    【讨论】:

                    • 我得到了Timestamp(seconds=1560523991, nanoseconds=286000000)格式的时间戳,所以告诉我如何使用它
                    • 你试过了吗?我确定我就是这样使用它的。不幸的是,我目前无法检查。
                    • 我将时间戳作为对象
                    • @aryan singh 请检查我对您问题的回答。
                    猜你喜欢
                    • 2020-03-21
                    • 1970-01-01
                    • 2020-02-23
                    • 2021-04-06
                    • 2020-12-06
                    • 2016-11-26
                    • 2021-04-14
                    • 2018-06-15
                    • 2020-06-07
                    相关资源
                    最近更新 更多