转换时间戳

我找不到解决这个问题的办法,我正在从 Firebase 获取数据,其中一个字段是一个时间戳,看起来像这样—— > 1522129071。如何将其转换为日期?

快速示例(作品) :

func readTimestamp(timestamp: Int) {
let now = Date()
let dateFormatter = DateFormatter()
let date = Date(timeIntervalSince1970: Double(timestamp))
let components = Set<Calendar.Component>([.second, .minute, .hour, .day, .weekOfMonth])
let diff = Calendar.current.dateComponents(components, from: date, to: now)
var timeText = ""


dateFormatter.locale = .current
dateFormatter.dateFormat = "HH:mm a"


if diff.second! <= 0 || diff.second! > 0 && diff.minute! == 0 || diff.minute! > 0 && diff.hour! == 0 || diff.hour! > 0 && diff.day! == 0 {
timeText = dateFormatter.string(from: date)
}
if diff.day! > 0 && diff.weekOfMonth! == 0 {
timeText = (diff.day == 1) ? "\(diff.day!) DAY AGO" : "\(diff.day!) DAYS AGO"
}
if diff.weekOfMonth! > 0 {
timeText = (diff.weekOfMonth == 1) ? "\(diff.weekOfMonth!) WEEK AGO" : "\(diff.weekOfMonth!) WEEKS AGO"
}


return timeText
}

我的飞镖尝试:

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 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;
}
250287 次浏览

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

改变:

var date = new DateTime.fromMicrosecondsSinceEpoch(timestamp);

var date = DateTime.fromMillisecondsSinceEpoch(timestamp * 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;
}

感谢 Alex Haslam 的帮助!

嗯,只要使用 https://github.com/andresaraujo/timeago.dart库,它会为你做所有繁重的工作。

编辑:

从您的问题,似乎您想要相对时间转换,并且 很久以前库使您能够做到这一点在1行代码。转换日期不是我自己会选择实现的东西,因为有很多边缘情况和它变得很快,特别是如果你需要支持不同的地区在未来。编写的代码越多 = 需要测试的代码越多。

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(timestampsInSnapshotsEnabled: true);设置为返回 Timestamp 而不是 Date 对象。

  • 从毫秒开始:

    var millis = 978296400000;
    var dt = DateTime.fromMillisecondsSinceEpoch(millis);
    
    
    // 12 Hour format:
    var d12 = DateFormat('MM/dd/yyyy, hh:mm a').format(dt); // 12/31/2000, 10:00 PM
    
    
    // 24 Hour format:
    var d24 = DateFormat('dd/MM/yyyy, HH:mm').format(dt); // 31/12/2000, 22:00
    
  • 返回文章页面

    Map<String, dynamic> map = docSnapshot.data()!;
    DateTime dt = (map['timestamp'] as Timestamp).toDate();
    
  • 将一种格式转换为另一种格式:

    • 12小时至24小时:

      var input = DateFormat('MM/dd/yyyy, hh:mm a').parse('12/31/2000, 10:00 PM');
      var output = DateFormat('dd/MM/yyyy, HH:mm').format(input); // 31/12/2000, 22:00
      
    • 24小时至12小时:

      var input = DateFormat('dd/MM/yyyy, HH:mm').parse('31/12/2000, 22:00');
      var output = DateFormat('MM/dd/yyyy, hh:mm a').format(input); // 12/31/2000, 10:00 PM
      

使用 英特尔包(用于格式化)

所有这些都可以工作,但是为了快速简单的修复,您可以使用 Time _ formatter 时间格式化程序包。

使用这个包,您可以将时代转换为人类可读的时间。

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"

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

如果有人来这里转换基地 Timestamp在这里这将有所帮助

Timestamp time;
DateTime.fromMicrosecondsSinceEpoch(time.microsecondsSinceEpoch)

只要确保乘以正确的因子:

微: 乘以 1000000(10次方6)

Milli: 乘以 1000(10次方3)

这就是 飞镖里面应该是的样子:

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

或者

var date = new DateTime.fromMillisecondsSinceEpoch(timestamp * 1000);

只需使用 .toDate()方法就可以将 FirestorTimestamp转换为 DateTime对象。

例如:

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

正如你在 医生中看到的

如果您只是想将 Timestamp 转换为 DateTime,

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;
}

假设 timestamp firestore 中的字段称为 timestamp,那么可以在 dart 中调用返回的映射上的 toDate ()方法。

// 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();

测试细节可以在这里找到: https://www.youtube.com/watch?v=W_X8J7uBPNw&feature=youtu.be

如何实施:

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');

结果:

02/15/21

以上代码解决了我的问题。我希望,这也会对你有所帮助。谢谢你提出这个问题。

Timestamp 有[ toDate ]方法,那么您可以直接使用它作为 DateTime。

timestamp.toDate();
// return DateTime object

如果你真的想转换它,还有一个愚蠢的方法:

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

Assuming you have a class

class Dtime {
int dt;
Dtime(this.dt);


String formatYMED() {
var date = DateTime.fromMillisecondsSinceEpoch(this.dt);
var formattedDate = DateFormat.yMMMMEEEEd().format(date);
return formattedDate;
}


String formatHMA() {
var time = DateTime.fromMillisecondsSinceEpoch(this.dt * 1000);
final timeFormat = DateFormat('h:mm a', 'en_US').format(time);
return timeFormat;
}

虽然我是个初学者,但我希望这能起作用。

以字符串的形式打印日期时间,时间戳从 Firebase Firestore:

      Timestamp t;
String s;
DateTime d;
//Declaring Variables
snapshots.data.docs[index]['createdAt'] is Timestamp
? t = snapshots.data.docs[index]['createdAt']
: s =
snapshots.data.docs[index]['createdAt'].toString();
            

//check createdAt field Timestamp or DateTime
snapshots.data.docs[index]['createdAt'] is Timestamp
? d = t.toDate()
: s =
snapshots.data.docs[index]['createdAt'].toString();
            

print(s.toString()); //Print Date and Time if DateTime
print(d.toString()); //Print Date and Time if TimeStamp

只需调用此方法以 String 形式返回所需的 DateTime 值。

String parseTimeStamp(int value) {
var date = DateTime.fromMillisecondsSinceEpoch(value * 1000);
var d12 = DateFormat('MM-dd-yyyy, hh:mm a').format(date);
return d12;
}

示例: 如果您传递 TimeStamp 值 1636786003,您将得到如下结果

11-12-2021, 10:46PM

长格式日期转换为日历格式日期:

var responseDate = 1637996744;
var date = DateTime.fromMillisecondsSinceEpoch(responseDate);
//to format date into different types to display;
// sample format: MM/dd/yyyy : 11/27/2021
var dateFormatted = DateFormat('MM/dd/yyyy').format(date);
// sample format: dd/MM/yyy : 27/11/2021
var dateFormatted = DateFormat('dd/MM/yyyy').format(date);
// sample format: dd/MMM/yyyy : 27/Nov/2021
var dateFormatted = DateFormat('dd/MMM/yyyy').format(date);
// sample format: dd/MMMM/yyyy : 27/November/2021
var dateFormatted = DateFormat('dd/MMMM/yyyy').format(date);
print("Date After Format = $dateFormatted");

最近我遇到了同样的问题,所以我用简单的逻辑。 非常简单的 转换 时间戳日期时间。我们可以使用这个 走开 时间戳日期时间格式。

enter image description here

enter image description here

在这个例子中,我使用 Firebase。

import 'package:intl/intl.dart'; /// Import this line
TimeStamp timestamp = database.data()["date"] /// Firebase firestore date field value.
//Example Outputs:- Timestamp(seconds=1657706107, nanoseconds=261000000)
DateTime dateTime = timestamp.toDate(); /// It will be return Date and Time Both.
//Example Outputs:- 2022-07-13 15:25:07.261
String dateOnly = DateFormat('dd/MM/yyyy').format(dateTime); /// It will be only return date DD/MM/YYYY format
//Example Outputs:- 13/07/2022

在单行代码中

import 'package:intl/intl.dart'; /// Import this line
String dateOnly = DateFormat('dd/MM/yyyy').format(database.data()["date"].toDate()); /// It will be only return date DD/MM/YYYY format
//Example Outputs:- 13/07/2022

谢谢你来看我,还推销我的名声 编码之旅愉快..

二零二二年

实际上 Flutter 团队更新了 Timestamp 对象。

现在,如果你想从 Timestamp 转换到 dateTime,你可以使用下面的代码:

/*you Timestamp instance*/.toDate()
eg. Timestamp.now().toDate()

反之亦然如果你想把日期时间转换成时间戳你可以这样做:

Timestamp.fromDate(/*your DateTime instance*/)
eg. Timestamp.fromDate(DateTime.now())

希望对你有所帮助。