【问题标题】:Dynamically Calculate Time using Loops in Dart在 Dart 中使用循环动态计算时间
【发布时间】:2022-10-04 23:37:12
【问题描述】:

我需要使用以下 key-value 对在 List 中创建 96 个 Map 对象

{
    'id': 1, 
    'time': '00:00-00:15', 
    'slotNumber': '01', 
    'clicked': false
}

尽管使用循环可以轻松实现这一点,但主要的复杂性是在生成时间范围时开始的。每个对象中的 time 键需要以 15 分钟为间隔,并且应该采用 24 小时格式。例如,接下来的几个时间范围需要是00:15-00:3000:30-00:4500:45-01:00,等等。我努力寻找一个能满足我所有祈祷的包裹,但找不到任何东西。

最终输出需要看起来像这样:

var kSlots = [
  {'id': 1, 'time': '00:00-00:15', 'slotNumber': '01', 'clicked': false},
  {'id': 2, 'time': '00:15-00:30', 'slotNumber': '02', 'clicked': false},
  {'id': 3, 'time': '00:45-01:00', 'slotNumber': '03', 'clicked': false},
  {'id': 4, 'time': '01:00-01:15', 'slotNumber': '04', 'clicked': false},
  {'id': 5, 'time': '01:15-01:30', 'slotNumber': '05', 'clicked': false},
  {'id': 6, 'time': '01:30-01:45', 'slotNumber': '06', 'clicked': false},
  {'id': 7, 'time': '01:45-02:00', 'slotNumber': '07', 'clicked': false},
  {'id': 8, 'time': '02:00-02:15', 'slotNumber': '08', 'clicked': false}]

由于我现在需要从字符串中的给定开始日期生成时间,因此我尝试稍微修改@jamesdlin 的答案来实现这一点。但它会引发以下错误:

Uncaught Error: FormatException: Invalid date format
08:00

String getTimeRange(int i) {
  var midnight = DateTime.parse(DateFormat('HH:mm').format(DateTime.parse('08:00')));
  const interval = Duration(minutes: 15);
  var start = midnight.add(interval * i);
  var end = start.add(interval);
  var formatTime = DateFormat('HH:mm').format;
  return '${formatTime(start)}-${formatTime(end)}';
  
}

void main() {
  var slots = [
    for (var i = 0; i < 20; i += 1)
    <String, dynamic>{
      'id': i + 1,
      'time': getTimeRange(i),
      'slotNumber': '${i + 1}'.padLeft(2, '0'),
      'clicked': false,
    },
  ];
  
  slots.forEach(print);
}

【问题讨论】:

    标签: flutter dart


    【解决方案1】:

    循环遍历一个索引,并将该索引用作 15 分钟的 Duration 的乘数。

    然后,您可以将乘以的 Duration 添加到代表午夜的 DateTime(如果您的时间范围代表时间点)或直接格式化这些 Durations(如果它们代表持续时间)。

    我假设您的时间代表时间点:

    import 'package:intl/intl.dart';
    
    String getTimeRange(int i) {
      var midnight = DateTime.utc(2022, 1, 1);
      const interval = Duration(minutes: 15);
      var start = midnight.add(interval * i);
      var end = start.add(interval);
      var formatTime = DateFormat('HH:mm').format;
      return '${formatTime(start)}-${formatTime(end)}';
      
    }
    
    void main() {
      var slots = [
        for (var i = 0; i < 8; i += 1)
        <String, dynamic>{
          'id': i + 1,
          'time': getTimeRange(i),
          'slotNumber': '${i + 1}'.padLeft(2, '0'),
          'clicked': false,
        },
      ];
      
      slots.forEach(print);
    }
    

    【讨论】:

    • 我需要更改什么才能从特定时间开始计算?比如说如果我想从 08:00 开始生成时间段?
    • @coolhack7 然后使用 08:00 作为基准时间而不是午夜。
    【解决方案2】:

    您可以设置使用 DateTime 类而不是 String 并根据需要对其进行操作:https://api.flutter.dev/flutter/dart-core/DateTime-class.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多