Функция Dart не возвращает ожидаемое значение

#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