繁体   English   中英

如何在 dart-flutter 中对这样的时间列表进行排序 [ 2:00 AM , 10:00 AM , 6:00 PM ]?

[英]How to sort a list of timings like this [ 2:00 AM , 10:00 AM , 6:00 PM ] in dart-flutter?

我正在开发一个 flutter 应用程序,它的功能之一是添加您的药物剂量时间以提醒您服用药物。 我需要对时间进行排序以使“next_dose”出现在此处: https ://drive.google.com/file/d/1j5KrRbDj0J28_FrMKy7dazk4m9dw202d/view?usp=sharing

这是我要排序的列表示例

[8:30 AM, 3:30 PM, 9:30 AM, 7:00 AM]

我所做的功能是为了在 2 个时间之间获得更大的值

int greater(String element,String element2){
      var hour = element.toString().split(':')[0];
      var hour2 = element2.toString().split(':')[0];
      var minute = element.toString().split(':')[1].split(' ')[0];
      var minute2 = element2.toString().split(':')[1].split(' ')[0];
      var day = element.toString().split(':')[1].split(' ')[1];
      var day2 = element2.toString().split(':')[1].split(' ')[1];
      if(day == 'AM' && day2 == 'PM')
        return -1;
      else if(day2 == 'AM' && day == 'PM')
        return 1;
      else if(day == day2)
      {
        if(int.parse(hour) > int.parse(hour2)) return -1;
        else if(int.parse(hour) < int.parse(hour2)) return 1;
        else{
          if(int.parse(minute) > int.parse(minute2))
            return 1;
          else
            return -1;
        }
      }

在这里,我尝试使用该函数对列表“剂量”进行排序

dose.sort((a,b)=>greater(a,b));

如果回调将时间字符串解析为intDateTime对象并比较它们,那么它不会创建具有许多复杂逻辑的sort回调。 例如:

/// Parses a time of the form 'hh:mm AM' or 'hh:mm PM' to a 24-hour
/// time represented as an int.
///
/// For example, parses '3:30 PM' as 1530.
int parseTime(String time) {
  var components = time.split(RegExp('[: ]'));
  if (components.length != 3) {
    throw FormatException('Time not in the expected format: $time');
  }
  var hours = int.parse(components[0]);
  var minutes = int.parse(components[1]);
  var period = components[2].toUpperCase();
  
  if (hours < 1 || hours > 12 || minutes < 0 || minutes > 59) {
    throw FormatException('Time not in the expected format: $time');
  }
  
  if (hours == 12) {
    hours = 0;
  }
  
  if (period == 'PM') {
    hours += 12;
  }
  
  return hours * 100 + minutes;
}

void main() {
  var list = ['8:30 AM', '3:30 PM', '9:30 AM', '7:00 AM'];
  list.sort((a, b) => parseTime(a).compareTo(parseTime(b)));
  print(list); // Prints: [7:00 AM, 8:30 AM, 9:30 AM, 3:30 PM]
}

或者,您可以使用package:intlDateFormat.parse轻松地将字符串解析为DateTime对象。

这里我们通过传递开始和结束的持续时间来获得时间段。

List<String> createTimeSlot(
    Duration startTime, Duration endTime, BuildContext context,
    {Duration step = const Duration(minutes: 30)} // Gap between interval
    ) {
  var timeSlot = <String>[];

  var hourStartTime = startTime.inHours;
  var minuteStartTime = startTime.inMinutes.remainder(60);

  var hourEndTime = endTime.inHours;
  var minuteEndTime = endTime.inMinutes.remainder(60);

  do {
    timeSlot.add(TimeOfDay(hour: hourStartTime, minute: minuteStartTime)
        .format(context));
    minuteStartTime += step.inMinutes;
    while (minuteStartTime >= 60) {
      minuteStartTime -= 60;
      hourStartTime++;
    }
  } while (hourStartTime < hourEndTime ||
      (hourStartTime == hourEndTime && minuteStartTime <= minuteEndTime));

  debugPrint("Number of slot $timeSlot");

  return timeSlot;
}

函数调用

createTimeSlot(Duration(hours: 1, minutes: 30),
        Duration(hours: 3, minutes: 30), context);

输出:

Number of slot [1:30 AM, 2:00 AM, 2:30 AM, 3:00 AM, 3:30 AM]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM