在Dart / Flutter中将DateTime转换为时间之前

a2e*_*2en 3 dart flutter

问题是如何将Dart DateTime格式化为字符串,说明经过的时间,类似于您看到Stack Overflow上显示的时间的方式。

有没有比这更简单的方法

String timeAgo(DateTime d) {
 Duration diff = DateTime.now().difference(d);
 if (diff.inDays > 365)
  return "${(diff.inDays / 365).floor()} ${(diff.inDays / 365).floor() == 1 ? "year" : "years"} ago";
 if (diff.inDays > 30)
  return "${(diff.inDays / 30).floor()} ${(diff.inDays / 30).floor() == 1 ? "month" : "months"} ago";
 if (diff.inDays > 7)
  return "${(diff.inDays / 7).floor()} ${(diff.inDays / 7).floor() == 1 ? "week" : "weeks"} ago";
 if (diff.inDays > 0)
  return "${diff.inDays} ${diff.inDays == 1 ? "day" : "days"} ago";
 if (diff.inHours > 0)
  return "${diff.inHours} ${diff.inHours == 1 ? "hour" : "hours"} ago";
 if (diff.inMinutes > 0)
  return "${diff.inMinutes} ${diff.inMinutes == 1 ? "minute" : "minutes"} ago";
 return "just now";
}
Run Code Online (Sandbox Code Playgroud)

我觉得这有点矫kill过正。谢谢你,希望对别人有帮助

Jam*_*med 17

你也可以尝试我创建的这个包,Jiffy

您可以从现在开始获取相对时间

// This returns time ago from now
Jiffy.now().fromNow(); // a few seconds ago

//You can also pass in a DateTime Object or a string or a list
Jiffy.parseFromDateTime(DateTime.now()).fromNow; // a few seconds ago
//or
Jiffy.parseFromDateTime(DateTime(2018, 10, 25)).fromNow(); // a year ago
Jiffy.parse("2020-10-25").fromNow(); // in a year
Run Code Online (Sandbox Code Playgroud)

Jiffy 中的操作也很简单

var dateTime = Jiffy.now().add(hours: 3, months: 2);

dateTime.fromNow(); // in 2 months
Run Code Online (Sandbox Code Playgroud)

您还可以获取距现在指定时间的相对时间

Jiffy.parseFromList([2022, 10, 25])
   .from(Jiffy.parseFromList([2022, 1, 25])); // in 10 months
Run Code Online (Sandbox Code Playgroud)


Agu*_*ana 11

我通过使用 DateTime 扩展来简化Paresh 的答案

创建一个名为的新 dart 文件date_time_extension.dart,然后编写如下代码

extension DateTimeExtension on DateTime {


  String timeAgo({bool numericDates = true}) {
    final date2 = DateTime.now();
    final difference = date2.difference(this);

    if ((difference.inDays / 7).floor() >= 1) {
      return (numericDates) ? '1 week ago' : 'Last week';
    } else if (difference.inDays >= 2) {
      return '${difference.inDays} days ago';
    } else if (difference.inDays >= 1) {
      return (numericDates) ? '1 day ago' : 'Yesterday';
    } else if (difference.inHours >= 2) {
      return '${difference.inHours} hours ago';
    } else if (difference.inHours >= 1) {
      return (numericDates) ? '1 hour ago' : 'An hour ago';
    } else if (difference.inMinutes >= 2) {
      return '${difference.inMinutes} minutes ago';
    } else if (difference.inMinutes >= 1) {
      return (numericDates) ? '1 minute ago' : 'A minute ago';
    } else if (difference.inSeconds >= 3) {
      return '${difference.inSeconds} seconds ago';
    } else {
      return 'Just now';
    }
  }

  
}
Run Code Online (Sandbox Code Playgroud)

然后,像这样使用它

import 'package:utilities/extensions/date_time_extension.dart'; // <--- import the file you just create

product.createdAt.timeAgo(numericDates: false) // use it on your DateTime property
Run Code Online (Sandbox Code Playgroud)


Par*_*iya 9

你可以使用intl.dartFlutter的默认方法很容易地做到这一点

导入import 'package:intl/intl.dart';包并获取日期和时间之前的时间

那么让我们看看如何做到这一点,首先创建一个TimeAgo

import 'package:intl/intl.dart';

class TimeAgo{
  static String timeAgoSinceDate(String dateString, {bool numericDates = true}) {
    DateTime notificationDate = DateFormat("dd-MM-yyyy h:mma").parse(dateString);
    final date2 = DateTime.now();
    final difference = date2.difference(notificationDate);

    if (difference.inDays > 8) {
      return dateString;
    } else if ((difference.inDays / 7).floor() >= 1) {
      return (numericDates) ? '1 week ago' : 'Last week';
    } else if (difference.inDays >= 2) {
      return '${difference.inDays} days ago';
    } else if (difference.inDays >= 1) {
      return (numericDates) ? '1 day ago' : 'Yesterday';
    } else if (difference.inHours >= 2) {
      return '${difference.inHours} hours ago';
    } else if (difference.inHours >= 1) {
      return (numericDates) ? '1 hour ago' : 'An hour ago';
    } else if (difference.inMinutes >= 2) {
      return '${difference.inMinutes} minutes ago';
    } else if (difference.inMinutes >= 1) {
      return (numericDates) ? '1 minute ago' : 'A minute ago';
    } else if (difference.inSeconds >= 3) {
      return '${difference.inSeconds} seconds ago';
    } else {
      return 'Just now';
    }
  }

} 
Run Code Online (Sandbox Code Playgroud)

并以这种方式调用它并获得所需的输出

TimeAgo.timeAgoSinceDate(item.created_date), // In this example, 09-10-2020 08:29AM date format is getting passed, but you can pass it in any format.
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明


小智 6

我将timeago用于确切的目的,并发现它非常有用。它具有多种格式,并且还支持不同的语言。