Je ne pouvais pas trouver de solution à cela, j'attrape des données sur firebase et l'un des champs est l'horodatage qui ressemble à ceci -> 1522129071. Dans Swift, j'ai pu le convertir et le rendre lisible, mais je ne peux pas convertissez le code en Dart car je ne connais pas toutes les classes et que Google n’aide en rien.
Rapide :
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
}
Ma tentative de Dart:
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;
}
Et il renvoie les dates/heures qui sont waaaaaaay off.
METTRE À JOUR:
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;
}
Le format de votre timestamp est en fait en secondes (timestamp Unix) et non en microsecondes. Si oui, la réponse est la suivante:
Changement:
var date = new DateTime.fromMicrosecondsSinceEpoch(timestamp);
à
var date = new DateTime.fromMillisecondsSinceEpoch(timestamp * 1000);
Code complet pour ceux qui en ont besoin:
String readTimestamp(int timestamp) {
var now = new DateTime.now();
var format = new DateFormat('HH:mm a');
var date = new 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;
}
Merci Alex Haslam pour l'aide!
meh, utilisez simplement https://github.com/andresaraujo/timeago.Dart library; il fait tout le gros du travail pour vous.
MODIFIER:
D'après votre question, il semblait que vous vouliez des conversions en temps relatif, et la bibliothèque timeago vous permet de le faire en une ligne de code. La conversion de dates n'est pas une solution que je choisirais de mettre en œuvre moi-même, car il y a beaucoup de cas Edge et cela devient rapidement fugace, surtout si vous devez prendre en charge différents paramètres régionaux à l'avenir. Plus vous écrivez de code, plus vous devez tester.
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
pour convertir epochMS en DateTime, utilisez simplement ...
final DateTime timeStamp = DateTime.fromMillisecondsSinceEpoch(1546553448639);
Si vous utilisez Firestore (et pas simplement en stockant l'horodatage sous forme de chaîne), un champ de date dans un document renverra un horodatage. L'objet Timestamp contient une méthode toDate()
.
En utilisant timeago, vous pouvez créer un temps relatif très simplement:
_ago(Timestamp t) {
return timeago.format(t.toDate(), 'en_short');
}
build() {
return Text(_ago(document['mytimestamp'])));
}
Assurez-vous de définir _firestore.settings(timestampsInSnapshotsEnabled: true);
pour renvoyer un horodatage au lieu d'un objet Date.