#flutter #dart
Вопрос:
Я создал функцию, которая получает строковую дату и возвращает строку, которая показывает время между заданной датой и текущим временем даты в формате: x дней назад, x месяцев назад, только что, x лет назад, вчера и т. Д:
Это код для этой функции:
String tiempoDesdeFecha(String dateString, {bool numericDates = true}) {
DateTime date = DateTime.parse(dateString);
final date2 = DateTime.now();
final difference = date2.difference(date);
if ((difference.inDays / 365).floor() >= 2) {
return "hace".tr() '${(difference.inDays / 365).floor()}' "yearsago".tr();
} else if ((difference.inDays / 365).floor() >= 1 ) {
return (numericDates) ? '1yearago'.tr() : 'lastyear'.tr() " " (numericDates).toString();
} else if ((difference.inDays / 30).floor() >= 2) {
return "hace".tr() '${(difference.inDays / 365).floor()}' "monthsago".tr();
} else if ((difference.inDays / 30).floor() >= 1) {
return (numericDates) ? '1monthago'.tr() : 'lastmonth'.tr();
} else if ((difference.inDays / 7).floor() >= 2) {
return "hace".tr() '${(difference.inDays / 7).floor()}' 'weeksago'.tr();
} else if ((difference.inDays / 7).floor() >= 1) {
return (numericDates) ? "1weekago".tr() : 'lastweek'.tr();
} else if (difference.inDays >= 2) {
return "hace".tr() '${difference.inDays}' 'daysago'.tr();
} else if (difference.inDays >= 1) {
return (numericDates) ? '1dayago'.tr() : 'yesterday'.tr();
} else if (difference.inHours >= 2) {
return "hace".tr() '${difference.inHours}' 'hoursago'.tr();
} else if (difference.inHours >= 1) {
return (numericDates) ? '1hourago'.tr() : 'anhourago'.tr();
} else if (difference.inMinutes >= 2) {
return "hace".tr() '${difference.inMinutes} ' 'minutesago'.tr();
} else if (difference.inMinutes >= 1) {
return (numericDates) ? '1minuteago'.tr() : 'aminuteago'.tr();
} else if (difference.inSeconds >= 3) {
return "hace".tr() '${difference.inSeconds}' 'secondsago'.tr();
} else {
return 'justnow'.tr();
}
}
Я включил код для отображения возвращаемой строки в одном из четырех языков, которые я использую.
Все работает нормально, но состояние:
else if ((difference.inDays / 30).floor() >= 2) {
return "hace".tr() '${(difference.inDays / 365).floor()}' "monthsago".tr();
который всегда возвращается 0 months ago
.
Я вызываю функцию из:
fecha_recibida = DateFormat('yyyy-MM-dd HH:mm',"en").format(date);
fecha_recibida = tiempoDesdeFecha(fecha_recibida);
Я проверяю эту проблему со следующей строковой датой:
«2021-5-5 19:34»
Что я делаю не так?
Комментарии:
1. Тело для этого состояния печатается
difference.inDays / 365
вместоdifference.inDays / 30
, поэтому оно печатает количество лет. Кроме того, к вашему сведению, вы можете использовать усечение целочисленного деления (~/
) и избежать необходимости постоянно звонитьfloor()
.2. @jamesdlin, вы правы, все работает так, как вы предлагаете, пожалуйста, сформулируйте свое предложение в качестве ответа на мой вопрос.
3. Кроме того, вы также можете использовать pub.dev/пакеты/timeago
4. Я прокомментировал вместо публикации ответа, потому что эта проблема была вызвана опечаткой и поэтому должна быть закрыта. Это, как правило, не будет полезно другим людям.
5. @jamesdlin, на самом деле это была не опечатка, но я понимаю вашу точку зрения. Я бы принял ваше предложение как правильный ответ
Ответ №1:
Я полагаю, что ошибка в возвращаемой строке,
difference.inDays / 365
должен быть difference.inDays / 30
.
Таким образом, состояние должно выглядеть следующим образом..
else if ((difference.inDays / 30).floor() >= 2) {
return "hace".tr() '${(difference.inDays / 30).floor()}' "monthsago".tr();
Плюс, как упоминал @aman, вы можете использовать пакет timeago