Dart 省道/颤振:转换时间戳

Dart 省道/颤振:转换时间戳,dart,flutter,Dart,Flutter,我找不到解决方案,我正在从firebase获取数据,其中一个字段是时间戳,看起来像->1522129071。如何将其转换为日期 Swift示例(工程): func readTimestamp(时间戳:Int){ 让我们现在=日期() 让dateFormatter=dateFormatter() 让日期=日期(时间间隔自1970年起:双精度(时间戳)) let components=Set([.second、.minute、.hour、.day、.weekOfMonth]) 让diff=Calen

我找不到解决方案,我正在从firebase获取数据,其中一个字段是时间戳,看起来像->1522129071。如何将其转换为日期

Swift示例(工程):

func readTimestamp(时间戳:Int){
让我们现在=日期()
让dateFormatter=dateFormatter()
让日期=日期(时间间隔自1970年起:双精度(时间戳))
let components=Set([.second、.minute、.hour、.day、.weekOfMonth])
让diff=Calendar.current.dateComponents(组件,从:日期,到:现在)
var timeText=“”
dateFormatter.locale=.current
dateFormatter.dateFormat=“HH:mm a”
如果差异秒!0和差异分钟!==0和差异小时!==0和差异小时!==0和差异日!==0{
timeText=dateFormatter.string(起始日期:日期)
}
如果差异日!>0和差异周月!==0{
timeText=(diff.day==1)?“\(diff.day!)日前”:“\(diff.day!)日前”
}
如果差异周数月数!>0{
timeText=(diff.weekOfMonth==1)?“\(diff.weekOfMonth!)周前”:“\(diff.weekOfMonth!)周前”
}
返回时间文本
}
我的飞镖尝试:

String readTimestamp(int timestamp) {
    var now = new DateTime.now();
    var format = new DateFormat('HH:mm a');
    var date = new DateTime.fromMicrosecondsSinceEpoch(timestamp);
    var diff = date.difference(now);
    var time = '';

    if (diff.inSeconds <= 0 || diff.inSeconds > 0 && diff.inMinutes == 0 || diff.inMinutes > 0 && diff.inHours == 0 || diff.inHours > 0 && diff.inDays == 0) {
      time = format.format(date); // Doesn't get called when it should be
    } else {
      time = diff.inDays.toString() + 'DAYS AGO'; // Gets call and it's wrong date
    }

    return time;
}
String readTimestamp(int timestamp){
var now=new DateTime.now();
var格式=新的日期格式('HH:mm a');
var date=新的日期时间。从微秒开始(时间戳);
var diff=日期差异(现在);
var时间=“”;
如果(不一致项0和不一致项分钟==0 | |不一致项分钟>0和不一致项小时==0 | |不一致项小时>0和不一致项天==0){
time=format.format(date);//在应该调用的时候不会被调用
}否则{
time=diff.inDays.toString()+'DAYS AGO';//收到调用,但日期错误
}
返回时间;
}
并且它返回的日期/时间是waaaaaaaaay关闭的

更新:

String readTimestamp(int timestamp) {
    var now = new DateTime.now();
    var format = new DateFormat('HH:mm a');
    var date = new DateTime.fromMicrosecondsSinceEpoch(timestamp * 1000);
    var diff = date.difference(now);
    var time = '';

    if (diff.inSeconds <= 0 || diff.inSeconds > 0 && diff.inMinutes == 0 || diff.inMinutes > 0 && diff.inHours == 0 || diff.inHours > 0 && diff.inDays == 0) {
      time = format.format(date);
    } else {
      if (diff.inDays == 1) {
        time = diff.inDays.toString() + 'DAY AGO';
      } else {
        time = diff.inDays.toString() + 'DAYS AGO';
      }
    }

    return time;
  }
String readTimestamp(int timestamp){
var now=new DateTime.now();
var格式=新的日期格式('HH:mm a');
var date=新的日期时间。从微秒开始(时间戳*1000);
var diff=日期差异(现在);
var时间=“”;
如果(不一致项0和不一致项分钟==0 | |不一致项分钟>0和不一致项小时==0 | |不一致项小时>0和不一致项天==0){
时间=格式。格式(日期);
}否则{
如果(差异天数==1){
时间=diff.inDays.toString()+“前一天”;
}否则{
time=diff.inDays.toString()+“天以前”;
}
}
返回时间;
}

您的时间戳格式实际上是秒(Unix时间戳),而不是微秒。如果是,答案如下:

更改:

var date=new DateTime.fromMicrosecondsSincepoch(时间戳);

var-date=DateTime.fromMillissecondssinceepoch(时间戳*1000);

所有需要它的人的完整代码:

String readTimestamp(int timestamp) {
    var now = DateTime.now();
    var format = DateFormat('HH:mm a');
    var date = DateTime.fromMillisecondsSinceEpoch(timestamp * 1000);
    var diff = now.difference(date);
    var time = '';

    if (diff.inSeconds <= 0 || diff.inSeconds > 0 && diff.inMinutes == 0 || diff.inMinutes > 0 && diff.inHours == 0 || diff.inHours > 0 && diff.inDays == 0) {
      time = format.format(date);
    } else if (diff.inDays > 0 && diff.inDays < 7) {
      if (diff.inDays == 1) {
        time = diff.inDays.toString() + ' DAY AGO';
      } else {
        time = diff.inDays.toString() + ' DAYS AGO';
      }
    } else {
      if (diff.inDays == 7) {
        time = (diff.inDays / 7).floor().toString() + ' WEEK AGO';
      } else {

        time = (diff.inDays / 7).floor().toString() + ' WEEKS AGO';
      }
    }

    return time;
  }
String readTimestamp(int timestamp){
var now=DateTime.now();
var format=DateFormat('HH:mm a');
var date=日期时间。从毫秒到新纪元(时间戳*1000);
var diff=当前差异(日期);
var时间=“”;
如果(不一致项0和不一致项分钟==0 | |不一致项分钟>0和不一致项小时==0 | |不一致项小时>0和不一致项天==0){
时间=格式。格式(日期);
}否则如果(差异天数>0和差异天数<7){
如果(差异天数==1){
时间=diff.inDays.toString()+“前一天”;
}否则{
time=diff.inDays.toString()+“天以前”;
}
}否则{
如果(差异天数==7){
时间=(diff.inDays/7).floor().toString()+“一周前”;
}否则{
时间=(不同的天数/7).floor().toString()+“周前”;
}
}
返回时间;
}
谢谢Alex Haslam的帮助

meh,只需使用库;它为你做所有的重担

编辑:

从您的问题来看,似乎您需要相对时间转换,而timeago库使您能够在一行代码中完成此操作。转换日期并不是我会选择自己实现的事情,因为有很多边缘情况&转换速度非常快,特别是如果将来需要支持不同的地区。编写的代码越多=需要测试的代码越多

import 'package:timeago/timeago.dart' as timeago;

final fifteenAgo = DateTime.now().subtract(new Duration(minutes: 15));
print(timeago.format(fifteenAgo)); // 15 minutes ago
print(timeago.format(fifteenAgo, locale: 'en_short')); // 15m
print(timeago.format(fifteenAgo, locale: 'es'));

// Add a new locale messages
timeago.setLocaleMessages('fr', timeago.FrMessages());

// Override a locale message
timeago.setLocaleMessages('en', CustomMessages());

print(timeago.format(fifteenAgo)); // 15 min ago
print(timeago.format(fifteenAgo, locale: 'fr')); // environ 15 minutes
要将epochMS转换为DateTime,只需使用

final DateTime timeStamp = DateTime.fromMillisecondsSinceEpoch(1546553448639);

如果您使用firestore(而不仅仅是将时间戳存储为字符串),文档中的日期字段将返回时间戳。Timestamp对象包含一个
toDate()
方法

使用timeago,您可以非常简单地创建相对时间:

_ago(Timestamp t) {
  return timeago.format(t.toDate(), 'en_short');
}

build() {
  return  Text(_ago(document['mytimestamp'])));
}
确保设置firestore.settings(TimestampsSinSnapshotSenabled:true)返回时间戳而不是日期对象。

您可以使用package,first import

import 'package:intl/intl.dart';
然后

int timeInMillis = 1586348737122;
var date = DateTime.fromMillisecondsSinceEpoch(timeInMillis);
var formattedDate = DateFormat('MM/dd, hh:mm a').format(date); // 12/31, 11:59 pm

以上所有这些都可以工作,但要快速简便地修复,您可以使用该软件包

使用此软件包,您可以将历元转换为人类可读的时间

String convertTimeStamp(timeStamp){
//Pass the epoch server time and the it will format it for you 
   String formatted = formatTime(timeStamp).toString();
   return formatted;
}
//Then you can display it
Text(convertTimeStamp['createdTimeStamp'])//< 1 second : "Just now" up to < 730 days : "1 year"
字符串转换时间戳(时间戳){
//传递epoch服务器时间,它将为您格式化它
String formatted=formatTime(timeStamp).toString();
返回格式;
}
//然后你可以显示它
文本(convertTimeStamp['createdTimeStamp'])/<1秒:“刚刚”到<730天:“1年”

在这里,您可以检查将要显示的输出格式:

如果有人来这里转换firebase
时间戳,这将有所帮助

Timestamp time;
DateTime.fromMicrosecondsSinceEpoch(time.microsecondsSinceEpoch)

只需确保乘以正确的系数:

Micro:乘以1000000(10次方6)

Milli:乘以1000(10次方3)

这就是它在Dart中的外观:

var date = new DateTime.fromMicrosecondsSinceEpoch(timestamp * 1000000);


要将Firestore
Timestamp
转换为
DateTime
对象,只需使用
.toDate()
方法

例如:

Timestamp now = Timestamp.now();
DateTime dateNow = now.toDate();

正如您在

中所看到的,如果您只是想将时间戳转换为日期时间

Timestamp timestamp = widget.firebaseDocument[timeStampfield];
DateTime date = Timestamp.fromMillisecondsSinceEpoch(
                timestamp.millisecondsSinceEpoch).toDate();

我不知道这对谁有帮助。之前的信息对我有帮助,所以我在这里建议f
Timestamp now = Timestamp.now();
DateTime dateNow = now.toDate();
Timestamp timestamp = widget.firebaseDocument[timeStampfield];
DateTime date = Timestamp.fromMillisecondsSinceEpoch(
                timestamp.millisecondsSinceEpoch).toDate();
import 'package:intl/intl.dart';

    DateTime convertTimeStampToDateTime(int timeStamp) {
     var dateToTimeStamp = DateTime.fromMillisecondsSinceEpoch(timeStamp * 1000);
     return dateToTimeStamp;
   }

  String convertTimeStampToHumanDate(int timeStamp) {
    var dateToTimeStamp = DateTime.fromMillisecondsSinceEpoch(timeStamp * 1000);
    return DateFormat('dd/MM/yyyy').format(dateToTimeStamp);
  }

   String convertTimeStampToHumanHour(int timeStamp) {
     var dateToTimeStamp = DateTime.fromMillisecondsSinceEpoch(timeStamp * 1000);
     return DateFormat('HH:mm').format(dateToTimeStamp);
   }

   int constructDateAndHourRdvToTimeStamp(DateTime dateTime, TimeOfDay time ) {
     final constructDateTimeRdv = dateTimeToTimeStamp(DateTime(dateTime.year, dateTime.month, dateTime.day, time.hour, time.minute)) ;
     return constructDateTimeRdv;
   }
// Map from firestore
// Using flutterfire package hence the returned data()
Map<String, dynamic> data = documentSnapshot.data();
DateTime _timestamp = data['timestamp'].toDate();
// Map from firestore
// Using flutterfire package hence the returned data()
Map<String, dynamic> data = documentSnapshot.data();
DateTime _timestamp = data['timestamp'].toDate();
import 'package:intl/intl.dart';

getCustomFormattedDateTime(String givenDateTime, String dateFormat) {
    // dateFormat = 'MM/dd/yy';
    final DateTime docDateTime = DateTime.parse(givenDateTime);
    return DateFormat(dateFormat).format(docDateTime);
}
getCustomFormattedDateTime('2021-02-15T18:42:49.608466Z', 'MM/dd/yy');
DateTime.parse(timestamp.toDate().toString())