如何将时间戳取整到最接近的5分钟值

时间:2019-03-22 22:29:42

标签: perl date timestamp

我将这种格式用于时间戳:

2019-01-24T00:00:05.011719

如何将其四舍五入到最接近的5分钟值?在perl中

编辑:好的,这个问题非常模糊和懒惰。但是问题仍然存在,只是想向我的问题中添加信息。

  1. 我不知道它是哪种格式,所以如果我知道我可以用google搜索,什么函数或方法可以转换这些日期格式。

  2. 20190124000000这不是正确的5分钟值吗?顺便说一句,我希望它像这种格式。但是它太容易成为正确的方法了,它使我感到怀疑,就像在大学里回答数学问题一样。无论如何,我只能为此使用正则表达式。

2 个答案:

答案 0 :(得分:3)

2019-01-24T00:00:05.011719

请注意,int changesReceived = 0; using (SqlDependencyEx sqlDependency = new SqlDependencyEx( TEST_CONNECTION_STRING, TEST_DATABASE_NAME, TEST_TABLE_NAME)) { sqlDependency.TableChanged += (o, e) => changesReceived++; sqlDependency.Start(); // Make table changes. MakeTableInsertDeleteChanges(changesCount); // Wait a little bit to receive all changes. Thread.Sleep(1000); } Assert.AreEqual(changesCount, changesReceived); 所使用的格式不明确,如果相关的时区遵守DST(由于秋天重复了一个小时)。

除此之外,上述代码可以正确处理时间的不连续性,例如DST更改时发生的不连续性,只要不连续性在一个舍入点处开始和结束。

答案 1 :(得分:1)

问题可以归结为:

  • 选择一个时间段N时间单位
  • 选择第一个(第0个)时间段的起点(纪元)
  • 解析时间戳并将其转换为“自时代以来的{X个时间单位”
    • X除以N的整数除以得出时间戳所在的时间段的数字。
    • X除以N的余数为您提供该期间内的偏移量
    • 如果余数正好是0(零),则时间戳记就是该时间段的开始

您的要求是

  • N是5分钟或300秒
  • 让我们使用标准UNIX Epoch,即1970-01-01T00:00:00Z
  • 除非时间戳记正好是一个周期的开始,否则您要舍入到下一个周期。
  • 由于您没有指定时区,为简单起见,我假设使用UTC

仅使用核心Perl(即Time::Piece),解决方案将是:

#!/usr/bin/perl
use warnings;
use strict;

use constant PERIOD => 5 * 60; # 5 minutes

use Time::Piece;

# timezone for Time::Piece->new()
$ENV{TZ} = "UTC";

while (<DATA>) {
    chomp;
    my($iso8601, $fractional) = split(/\./);

    # NOTE: time is interpreted as UTC
    my $t = Time::Piece->strptime($iso8601, '%FT%T');

    # calculate multiple of PERIOD and offset in that period
    my $index  = int($t->epoch / PERIOD);
    my $offset = $t->epoch % PERIOD + "0.${fractional}";

    # round up to next PERIOD unless time is exactly multiple of PERIOD
    $index++ if $offset > 0;

    # convert index back to epoch and generate new Time::Piece object
    # NOTE: timezone offset is set to $ENV{TZ} timezone
    my $t2 = Time::Piece->new($index * PERIOD, 0);

    print "$_ -> ", $t2->strftime('%FT%T'), "\n";
}

exit 0;

__DATA__
2019-01-24T00:00:00.000000
2019-01-24T00:00:05.011719
2019-01-24T00:04:59.999999
2019-01-24T00:05:00.000000
2019-07-24T00:00:00.000000
2019-07-24T00:00:05.011719
2019-07-24T00:04:59.999999
2019-07-24T00:05:00.000000

试运行:

$ perl dummy.pl
2019-01-24T00:00:00.000000 -> 2019-01-24T00:00:00
2019-01-24T00:00:05.011719 -> 2019-01-24T00:05:00
2019-01-24T00:04:59.999999 -> 2019-01-24T00:05:00
2019-01-24T00:05:00.000000 -> 2019-01-24T00:05:00
2019-07-24T00:00:00.000000 -> 2019-07-24T00:00:00
2019-07-24T00:00:05.011719 -> 2019-07-24T00:05:00
2019-07-24T00:04:59.999999 -> 2019-07-24T00:05:00
2019-07-24T00:05:00.000000 -> 2019-07-24T00:05:00