Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/31.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从00:00开始的Perl增量时间_Perl_Datetime Format - Fatal编程技术网

从00:00开始的Perl增量时间

从00:00开始的Perl增量时间,perl,datetime-format,Perl,Datetime Format,我想生成一个时间数组,格式为hh:mm,给定时间间隔和时间点数量,从零开始。因此,10分钟的3个时间点将产生(00:00,00:10,00:20)。我发现了一个非常好的片段,用于在一小时后增加时间并格式化时间: perl -e '@d=localtime time() + 600 - localtime time(); printf "%02d:%02d%s\n",$d[2]%12,$d[1]' 如何用“00:00”替换“now”?使用基本Perl模块的额外积分 谢谢, L.算法非常简单;下

我想生成一个时间数组,格式为hh:mm,给定时间间隔和时间点数量,从零开始。因此,10分钟的3个时间点将产生(00:00,00:10,00:20)。我发现了一个非常好的片段,用于在一小时后增加时间并格式化时间:

perl -e '@d=localtime time() + 600 - localtime time(); 
printf "%02d:%02d%s\n",$d[2]%12,$d[1]'
如何用“00:00”替换“now”?使用基本Perl模块的额外积分

谢谢,
L.

算法非常简单;下面是一个函数,它接受两个参数,一个以分钟为单位的间隔长度和要返回的间隔数,并返回包含指定间隔的arrayref,以所需的时间格式表示:

sub intervals {
    my $interval = shift(); # interval length in minutes
    my $n_points = shift(); # number of intervals to return
    die "intervals() takes two arguments\n"
            unless $interval and $n_points;

    my @now_tm = localtime();

    # check DST delta per @ikegami
    my $dst_delta = 0;
    my @yesterday_tm = localtime(time() - 86400);
    if ($yesterday_tm[8] && !$now_tm[8]) {
            # "fall back" - today is an hour shorter
            $dst_delta = -3600;
    }
    elsif (!$yesterday_tm[8] && $now_tm[8]) {
            # "spring forward" - today is an hour longer
            $dst_delta = 3600;
    };

    # find timestamp for 00:00 today
    my $now_ts = time();
    my $then_ts = $now_ts
            + $dst_delta          # apply any dst correction required 
            - ($now_tm[2] * 3600) # subtract hours since midnight
            - ($now_tm[1] * 60)   # ...and minutes
            - $now_tm[0];         # ...and seconds

    # generate actual intervals, starting at midnight
    my @interval_times = ();
    for (my $point = 0; $point < $n_points; $point++) {
            my $interval_ts = $then_ts + (($interval * 60) * $point);
            my @interval_tm = localtime($interval_ts);
            my $interval_formatted = sprintf("%0.2d:%0.2d", 
                                             $interval_tm[2],
                                             $interval_tm[1]);
            push @interval_times, $interval_formatted;
    };

    return [@interval_times];
};

而且不需要Perl模块,无论是核心模块还是其他模块。

无论您在哪里找到该代码段,都应该将其放回原处。现在是数据和时间。时间是无法取代的。你也需要一个日期,因为并非所有时区的所有日子都有1:10,甚至0:10。您想使用今天的日期吗?您可以作为一个部件来解决您的问题,您的代码在一年中的某些日子会失败,因为DST跳过或插入了小时数
$now_tm[2]
不是从午夜开始的小时数。@ikegami一个很好的观点;我已经修改了函数来处理那个角落的情况。(至少在美国,DST修正是在0200时插入的,我认为这意味着
(time()-86400)
总是在昨天结束,即使是在长达23小时的“撤退”日。算法修正,适用于
(time()-86400)的地区)
不可能总是在昨天的某个时候结束,留给感兴趣的读者作为练习。)亚伦:上面说不要说谢谢,但我真的很感激这段代码@很高兴能帮上忙!不过,请注意,我实际上还没有测试过DST校正,所以在将其应用于生产之前,您需要先研究一下这一点——特别是,我怀疑我可能已经反转了DST delta的符号。
0  ARRAY(0xd284e40)
   0  '00:00'
   1  '00:10'
   2  '00:20'
   3  '00:30'
   4  '00:40'
   5  '00:50'
   6  '01:00'
   7  '01:10'
   8  '01:20'
   9  '01:30'
   10  '01:40'
   11  '01:50'
   12  '02:00'
   13  '02:10'
   14  '02:20'
   15  '02:30'
   16  '02:40'
   17  '02:50'
   18  '03:00'
   19  '03:10'