I couldn't find a solution to this, I'm grabbing data from firebase and one of the fields is a timestamp which looks like this -> 1522129071. How to convert it to a date?
Swift example (works) :
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 }
My attempt at 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; }
And it returns dates/times that are waaaaaaay off.
UPDATE:
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; }
To convert time to a number of hours, multiply the time by 24, which is the number of hours in a day. To convert time to minutes, multiply the time by 1440, which is the number of minutes in a day (24*60). To convert time to seconds, multiply the time time by 86400, which is the number of seconds in a day (24*60*60 ).
To convert a NUMBER to a TIMESTAMP you can use an expression like TO_TIMESTAMP(TO_CHAR(...)) . To compute the number of seconds between two timestamps, one solution is to cast both to dates, and substract them : you will get a (decimal) result in days, which can be then converted to seconds.
Your timestamp format is in fact in Seconds (Unix timestamp) as opposed to microseconds. If so the answer is as follows:
Change:
var date = new DateTime.fromMicrosecondsSinceEpoch(timestamp);
to
var date = DateTime.fromMillisecondsSinceEpoch(timestamp * 1000);
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With