Dart/Flutter : Conversion d'horodatage
Je ne pouvais pas trouver une solution à cela, je suis en saisissant les données de firebase et l'un des champs est un timestamp qui ressemble à ça -> 1522129071. Comment convertir une date?
Swift exemple (travaux) :
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 retourne dates/heures qui sont waaaaaaay off.
Mise à 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;
}
- Je vais supposer que votre timestamp est dans le mauvais format. Quel est votre timestamp int données ressembler? (Cela nous permettra de savoir si sa en quelques secondes. Millisecondes ou Microsecondes.
- J'ai l'app pour ios en cours d'exécution sur mon téléphone et il indique la date formatée. En utilisant le même timestamp à partir de la même base de données c'est donner des valeurs étranges dans dart/flutter. Ça ressemble à ça -> 1522129071. REMARQUE** Tous les horodateurs sont pour une raison quelconque montrant que la même.
- -> 1522129071 <- ???
- Quand je prends qu'à partir de la base de données qu'il affiche correctement avec le code swift, mais dans dart il montre 19:25 PM où il faut montrer à 15:50 PM, il y a 2 semaines, 4 semaines, etc...
- et pouvezvous en faire me montrer capture d'écran de firebase timestamp? êtes-vous à l'aide de type de données timestamp ou que vous venez de mettre millisecondes?
- il y a option d'horodatage dans firestore. vous venez de passer DateTime comme aussi des données de votre requête.
- 1527796211 est à quoi il ressemble généralement. Un int valeur de firebase.
- À l'aide de la fonction de Base de données, pas Firestore.
Vous devez vous connecter pour publier un commentaire.
Votre format d'horodatage est en fait en quelques Secondes (timestamp Unix), par opposition à la microseconde. Si la réponse est donc comme suit:
Changement:
à
fromMillisecondsSinceEpoch
PASfromMicrosecondsSinceEpoch
diff.inSeconds <= 0
AKA quoi que ce soit dans le passé. Promenade à travers votre règlement, comme si vous étiez l'ordinateur et de décider ce qui allait se passer.Code complet pour quelqu'un qui en a besoin:
Merci Alex Haslam pour l'aide!
meh, il suffit d'utiliser https://github.com/andresaraujo/timeago.dart de la bibliothèque; il fait tout le gros du travail pour vous.
EDIT:
De votre question, il semble que tu voulais relative conversions de temps, et le timeago bibliothèque vous permet de faire cela en 1 ligne de code. Conversion des Dates n'est pas quelque chose que je voudrais choisir de mettre en place moi-même, comme il y a beaucoup de cas de bord & ça devient moche rapidement, surtout si vous avez besoin de l'appui des endroits différents dans l'avenir. Plus de code que vous écrivez = plus vous avez de test.
pour convertir epochMS de type DateTime, il suffit d'utiliser...
Si vous utilisez firestore (et pas seulement de stocker le timestamp comme une chaîne de caractères) d'un champ de date dans un document de retour d'un Timestamp. L'Horodatage de l'objet contient un
toDate()
méthode.À l'aide de timeago vous pouvez créer un temps relatif, tout simplement:
Assurez-vous de définir
_firestore.settings(timestampsInSnapshotsEnabled: true);
pour retourner un Horodatage à la place d'un objet Date.