Флаттер, как вычесть время из другого времени

#flutter #dart

Вопрос:

У меня есть 2 раза, которые мне нужно вычесть, и я почти близок, но есть одна большая проблема

У меня есть 2 раза в строке, например, 10:00 утра и 10:00 вечера

И мой код такой

    var df =  DateFormat("hh:mm");                                           
   var durationStart =  DateFormat('HH:mm').format(df.parse(10:00AM));
   var durationEnd =  DateFormat('HH:mm').format(df.parse(10:00PM));
  
   print('durationStart ${durationStart}');
   print('durationEnd ${durationEnd}');


   var Startparts = durationStart.split(':');
   var startDurationSet = Duration(hours: int.parse(Startparts[0].trim()), minutes: int.parse(Startparts[1].trim()));


   var Endparts = durationEnd.split(':');
   var endDurationSet = Duration(hours: int.parse(Endparts[0].trim()), minutes: int.parse(Endparts[1].trim()));


   print('startDurationSet ${startDurationSet}');

   var result = Duration(hours: int.parse(Endparts[0].trim()) - int.parse(Startparts[0].trim()) , minutes: int.parse(Startparts[1].trim()) - int.parse(Endparts[1].trim()));
    
       print('result ${result.toString().replaceAll('-', '')}');
 

Таким образом, у меня есть 2 раза, один из которых-время начала, а другой-время окончания. Мне просто нужна разница между часами. например, у меня есть 10:00 утра и 01:00 вечера, мне нужно 3 часа, но он показывает 9 часов. Но то, что я получаю, если у меня есть 10:00 утра и 10:00 вечера, он показывает 0 часов, но должен показывать 12. То же

Комментарии:

1. Как насчет того, чтобы вы создали метод, который выполняет все вычисления, например, каждые 60 минут = 1 час?

2. Я создал класс utils. Вы можете проверить мой ответ. Если это полезно для вас, пожалуйста, примите.

Ответ №1:

Это легко, если вы можете правильно указать дату начала и окончания в DateTime

Подсказка, я использую "hh:mma" , так как это ваш исходный формат => "10:00AM"

Если я использую "HH:mm" , как вы, я всегда буду получать одно и то же время, так как оно не анализирует AM/PM после 10:00

 // Get your time in term of date time

DateTime startDate = DateFormat("hh:mma").parse("10:00AM");
DateTime endDate = DateFormat("hh:mma").parse("10:00PM");


// Get the Duration using the diferrence method

Duration dif = endDate.difference(startDate);

// Print the result in any format you want
print(dif.toString(); // 12:00:00.000000
print(dif.inHours); // 12

 

Ответ №2:

Вы ищете что-то подобное?

 TimeOfDay _calcTimeOfDay(int hour, int minute) {
    if (minute > 60) {
      minute = (minute % 60);
      hour  = 1;
    }

    return TimeOfDay(hour: hour, minute: minute);
}
 

Проблема в том, что если у вас есть час=24 и минута=75, то час будет равен 25, что не является допустимым часом.

Не уверен, что я полностью понимаю вопрос, может быть, вы сможете предоставить больше информации.

Ответ №3:

Что вам нужно добавить в свой формат даты, так это код для маркера am/pm: a . Используя либо формат hh:mma , либо h:ma должен работать.

Затем вы можете использовать DateTime.difference() для расчета разницы во времени от durationStart и durationEnd. Вот пример, который вы можете запустить на DartPad.

 import 'package:intl/intl.dart';
void main() {
  /// Set the format that of the Date/Time that like to parse
  /// h - 12h in am/pm
  /// m - minute in hour
  /// a - am/pm marker
  /// See more format here: https://pub.dev/documentation/intl/latest/intl/DateFormat-class.html
  var dateFormat =  DateFormat('h:ma');                                           
  DateTime durationStart =  dateFormat.parse('10:00AM');
  DateTime durationEnd =  dateFormat.parse('10:00PM');
  
  print('durationStart: $durationStart');
  print('durationEnd: $durationEnd');
  
  /// Fetch the difference using DateTime.difference()
  /// https://api.flutter.dev/flutter/dart-core/DateTime/difference.html
  print('difference: ${durationEnd.difference(durationStart).inHours}');
}
 

Ответ №4:

Пакет использования

международный: ^0.17.0

импорт ‘пакет:международный/международный дротик’;

  var dateFormat = DateFormat('h:ma');
  DateTime durationStart = dateFormat.parse('10:00AM');
  DateTime durationEnd = dateFormat.parse('1:00PM');

  print('durationStart: $durationStart');
  print('durationEnd: $durationEnd');

  var differenceInHours = durationEnd.difference(durationStart).inHours;

  print('difference: $differenceInHours hours');
 

введите описание изображения здесь

Ответ №5:

Я создал для вас один класс:

 import 'package:intl/intl.dart';

class DateUtils {
  static String getTimeDifference(String startTime, String endTime){
    /// Set the format that of the Date/Time that like to parse
    /// h - 12h in am/pm
    /// m - minute in hour
    /// a - am/pm marker
    /// See more format here: https://pub.dev/documentation/intl/latest/intl/DateFormat-class.html
    var dateFormat =  DateFormat('h:ma');
    DateTime durationStart =  dateFormat.parse(startTime);
    DateTime durationEnd =  dateFormat.parse(endTime);

    return '${durationEnd.difference(durationStart).inHours} hours';
  }
}
 

Как вы можете использовать:

 void main() {
  print("10:00PM, 10:30PM => "   DateUtils.getTimeDifference("10:00PM", "10:30PM"));
  print("12:00AM, 04:00AM => "   DateUtils.getTimeDifference("12:00AM", "04:00AM"));
  print("01:00AM, 03:00AM => "   DateUtils.getTimeDifference("01:00AM", "03:00AM"));
  print("12:00AM, 06:00PM => "   DateUtils.getTimeDifference("12:00AM", "06:00PM"));
  print("04:00PM, 03:00PM => "   DateUtils.getTimeDifference("04:00PM", "03:00PM"));
}
 

Выход:

 10:00PM, 10:30PM => 0 hours
12:00AM, 04:00AM => 4 hours
01:00AM, 03:00AM => 2 hours
12:00AM, 06:00PM => 18 hours
04:00PM, 03:00PM => -1 hours
 

Надеюсь, это будет полезно.