我将这种格式用于时间戳:
2019-01-24T00:00:05.011719
如何将其四舍五入到最接近的5分钟值?在perl中
编辑:好的,这个问题非常模糊和懒惰。但是问题仍然存在,只是想向我的问题中添加信息。
我不知道它是哪种格式,所以如果我知道我可以用google搜索,什么函数或方法可以转换这些日期格式。
20190124000000这不是正确的5分钟值吗?顺便说一句,我希望它像这种格式。但是它太容易成为正确的方法了,它使我感到怀疑,就像在大学里回答数学问题一样。无论如何,我只能为此使用正则表达式。
答案 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
时间单位X
个时间单位”
X
除以N
的整数除以得出时间戳所在的时间段的数字。X
除以N
的余数为您提供该期间内的偏移量0
(零),则时间戳记就是该时间段的开始您的要求是
N
是5分钟或300秒1970-01-01T00:00:00Z
仅使用核心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