在 Dart/Flutter 中将日期时间转换为之前的时间

问题描述 投票:0回答:8

问题是如何将 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";
}

谢谢您并希望对其他人有帮助

flutter datetime dart timestamp
8个回答
50
投票

我使用timeago来达到确切的目的,并发现它非常有用。它具有多种格式和不同语言的支持。


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

Jiffy 中的操作也很简单

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

dateTime.fromNow(); // in 2 months

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

Jiffy.parseFromList([2022, 10, 25])
   .from(Jiffy.parseFromList([2022, 1, 25])); // in 10 months

9
投票

我通过使用日期时间扩展来简化Paresh的答案

创建一个名为

date_time_extension.dart

 的新 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'; } } }
然后像这样使用它

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
    

1
投票
如果您只想使用

Datetime

库,这就是您可以做到的方式。

void main() { final currentTime = DateTime.now(); print('Current time: $currentTime'); final threeWeeksAgo = currentTime.subtract(const Duration(days: 21)); print('Three weeks ago: $threeWeeksAgo'); }
这就是你得到的:

Current time: 2022-09-29 11:26:58.350 Three weeks ago: 2022-09-08 11:26:58.350
    

1
投票
String timeAgoCustom(DateTime d) { // <-- Custom method Time Show (Display Example ==> 'Today 7:00 PM') // WhatsApp Time Show Status Shimila 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 "${DateFormat.E().add_jm().format(d)}"; if (diff.inHours > 0) return "Today ${DateFormat('jm').format(d)}"; if (diff.inMinutes > 0) return "${diff.inMinutes} ${diff.inMinutes == 1 ? "minute" : "minutes"} ago"; return "just now"; } Add This Package --> intl: ^0.17.0 Time Show Example (Today 8:29 PM)
    

0
投票
你可以使用这个方法,它会给你很多时间。

String convertToAgo(String dateTime) { DateTime input = DateFormat('yyyy-MM-DDTHH:mm:ss.SSSSSSZ').parse(dateTime, true); Duration diff = DateTime.now().difference(input); if (diff.inDays >= 1) { return '${diff.inDays} day${diff.inDays == 1 ? '' : 's'} ago'; } else if (diff.inHours >= 1) { return '${diff.inHours} hour${diff.inHours == 1 ? '' : 's'} ago'; } else if (diff.inMinutes >= 1) { return '${diff.inMinutes} minute${diff.inMinutes == 1 ? '' : 's'} ago'; } else if (diff.inSeconds >= 1) { return '${diff.inSeconds} second${diff.inSeconds == 1 ? '' : 's'} ago'; } else { return 'just now'; } }
    

0
投票
希望你能得到答案!您只需要在此方法中传递您的时间戳值,您就会得到一个前段时间格式化的字符串。

String getVerboseDateTimeRepresentation(DateTime dateTime) { DateTime now = DateTime.now().toLocal(); DateTime localDateTime = dateTime.toLocal(); if (localDateTime.difference(now).inDays == 0) { var differenceInHours = localDateTime.difference(now).inHours.abs(); var differenceInMins = localDateTime.difference(now).inMinutes.abs(); if (differenceInHours > 0) { return '$differenceInHours hours ago'; } else if (differenceInMins > 2) { return '$differenceInMins mins ago'; } else { return 'Just now'; } } String roughTimeString = DateFormat('jm').format(dateTime); if (localDateTime.day == now.day && localDateTime.month == now.month && localDateTime.year == now.year) { return roughTimeString; } DateTime yesterday = now.subtract(const Duration(days: 1)); if (localDateTime.day == yesterday.day && localDateTime.month == now.month && localDateTime.year == now.year) { return 'Yesterday'; } if (now.difference(localDateTime).inDays < 4) { String weekday = DateFormat( 'EEEE', ).format(localDateTime); return '$weekday, $roughTimeString'; } return '${DateFormat('yMd').format(dateTime)}, $roughTimeString'; }
    

-1
投票
@Alex289 答案的变体

extension DateHelpers on DateTime { String toTimeAgoLabel({bool isIntervalNumericVisible = true}) { final now = DateTime.now(); final durationSinceNow = now.difference(this); final inDays = durationSinceNow.inDays; if (inDays >= 1) { return (inDays / 7).floor() >= 1 ? isIntervalNumericVisible ? '1 week ago' : 'Last week' : inDays >= 2 ? '$inDays days ago' : isIntervalNumericVisible ? '1 day ago' : 'Yesterday'; } final inHours = durationSinceNow.inHours; if (inHours >= 1) { return inHours >= 2 ? '$inHours hours ago' : isIntervalNumericVisible ? '1 hour ago' : 'An hour ago'; } final inMinutes = durationSinceNow.inMinutes; if (inMinutes >= 2) { return inMinutes >= 2 ? '$inMinutes minutes ago' : isIntervalNumericVisible ? '1 minute ago' : 'A minute ago'; } final inSeconds = durationSinceNow.inSeconds; return inSeconds >= 3 ? '$inSeconds seconds ago' : 'Just now'; } }
    
© www.soinside.com 2019 - 2024. All rights reserved.