dart 如何在两个日期时间/小时内筛选列表?

iswrvxsc  于 2023-07-31  发布在  其他
关注(0)|答案(2)|浏览(81)

我有一个从服务器返回的列表,如下所示:

final userTimezone = currentUser?.timezone; // "America/New_York"

final list = [
  {id: 1, name: 'thing 1', startTime: 2023-07-14 07:30:00.000Z},
  {id: 2, name: 'thing 2', startTime: 2023-07-20 08:00:00.000Z},
  {id: 3, name: 'thing 3', startTime: 2023-07-25 20:15:00.000Z},
  {id: 4, name: 'thing 4', startTime: 2023-07-26 13:00:00.000Z},
];

字符串
所有这些都以UTC时区返回。
我想做的是过滤这个列表,以便只包含与用户所在时区相关的上午8点(08:00)到下午7点(19:00)之间的项目。
这是我尝试过的,但我不认为它一定是正确的:

list = list.where((appointment) {
        final start = appointment.startAt.toLocal();
        final end = appointment.endAt.toLocal();
        final startHour = start.hour;
        final endHour = end.hour;
        final startMinute = start.minute;
        final endMinute = end.minute;
        final startSecond = start.second;
        final endSecond = end.second;

        final isStartValid = startHour >= 8 && startHour <= 19 && startMinute == 0 && startSecond == 0;
        final isEndValid = endHour >= 8 && endHour <= 19 && endMinute == 0 && endSecond == 0;

        return isStartValid && isEndValid;
      }).toList();


我有几个项目似乎在可接受的范围内(没有在示例中列出),但它没有出现在列表中。
我是一个有点新的 dart ,所以我不完全确定什么是提供给我或没有。谢谢你的阅读。

5jvtdoz2

5jvtdoz21#

我用forEach写了这个,(时区没有区别,你可以使用它的代码):

List<DateTime> dates = [
DateTime.parse('2023-07-14 07:30:00.000'),
DateTime.parse('2023-07-14 07:30:00.000'),
DateTime.parse('2023-07-20 08:00:00.000'),
DateTime.parse('2023-07-26 13:00:00.000'),
DateTime.parse('2023-07-20 14:00:00.000'),
DateTime.parse('2023-07-20 19:00:00.000'),
DateTime.parse('2023-07-25 20:15:00.000'),
DateTime.parse('2023-07-25 21:15:00.000'),
DateTime.parse('2023-07-25 22:15:00.000'),
  ];

List<DateTime> new_dates = [];
 
dates.forEach((e) {
   if (e.hour >= 8 && e.hour <= 19) {
       new_dates.add(e);
   }
  });
print(new_dates);

字符串

qmelpv7a

qmelpv7a2#

现在,您的时间只有在分钟和秒为0时才有效,因此,例如,下午3:30的约会将被过滤掉。
你走在正确的道路上,但问题是,当他们最终不重要时,你会关注自己的分分秒秒。想想看-如果小时本身福尔斯在上午8:00和下午7:00之间,那么分钟和秒可能是什么,使整个时间戳不在这个范围内?

final filtered = list.where((appt) => {
  final start = appt.startAt.toLocal();
  final end = appt.endAt.toLocal();

  return (start.hour >= 8 && start.hour < 19) 
      && (end.hour >= 8 && end.hour < 19);
}).toList();

字符串

相关问题