【问题标题】:How to generate a DateTime range by step of 5 minutes?如何以 5 分钟为单位生成日期时间范围?
【发布时间】:2022-02-14 10:29:36
【问题描述】:

如何以 5 分钟为单位生成一个 DateTime 范围?以下是输出:

2022-02-13 00:00:00, 2022-02-13 00:05:00
2022-02-13 00:05:00, 2022-02-13 00:10:00
2022-02-13 00:10:00, 2022-02-13 00:15:00
2022-02-13 00:15:00, 2022-02-13 00:20:00
...
2022-02-13 23:45:00, 2022-02-13 23:50:00
2022-02-13 23:50:00, 2022-02-13 23:55:00
2022-02-13 23:55:00, 2022-02-14 00:00:00

【问题讨论】:

    标签: datetime raku


    【解决方案1】:

    Sequence operator可以用

    # when to start when to finish
    my $start = DateTime.now.truncated-to("day");
    my $end   = $start.later(:1day);
    
    # after start, add 5 mins repeatedly, and stop when end is exceeded
    say $start, *.later(:5minutes) ... * >= $end;
    

    【讨论】:

    • 我也正要发这个,在我看到你先说之前:)。如果你想在一行中写一个无限序列,你可以写成my $seq = (DateTime.new('2022-02-13T00:00:00'), *.later(:5minutes) … *)
    • DateTime.now.truncated-to("day") 我认为这是Date.today.DateTime 的简写?
    • @raiph 谢谢。如果可以的话,我发现第一个更具可读性
    【解决方案2】:

    使用Interval 模块。

    use Interval;
    my $dt = Interval[300].new(time);
    say $dt++ for ^5; 
    
    2022-02-13T15:29:03Z
    2022-02-13T15:34:03Z
    2022-02-13T15:39:03Z
    2022-02-13T15:44:03Z
    2022-02-13T15:49:03Z
    

    【讨论】:

      【解决方案3】:
      my $dt = Date.today.DateTime;
      
      $dt.clone: formatter => { .yyyy-mm-dd ~ q{ } ~ .hh-mm-ss }\
      andthen $_, *.later(:5minute) ... * eqv $dt.later(:1day)  
      andthen .rotor: 2 => -1 
      andthen .map: *.join(q{, }).put
      

      【讨论】:

      • clone on DateTime 在使用另一个 formatter 时很方便。
      【解决方案4】:

      我想出了另一个解决方案:

      sub MAIN() {
          my $fmt = {sprintf "%04d-%02d-%02d %02d:%02d:%02d", .year, .month, .day, .hour, .minute, .second};
      
          my @dates = gather given Date.today {
              my $current-datetime = .DateTime;
              while $current-datetime <= .succ.DateTime {
                  take $current-datetime;
                  $current-datetime = $current-datetime + Duration.new(300.0);
              }
          }
      
          for @dates.rotor(2 => -1) {
              printf("%s, %s\n", .[0].clone(formatter => $fmt), .[1].clone(formatter => $fmt));
          }
      }
      

      感谢@wamba 提供clone 方法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-06-17
        • 1970-01-01
        • 1970-01-01
        • 2013-01-28
        • 1970-01-01
        • 1970-01-01
        • 2017-07-27
        相关资源
        最近更新 更多