我使用以下函数以格式(例如) 02:49:02.506将时间戳转换为perl中的毫秒。
sub to_millis {
my( $hours, $minutes, $seconds, $millis) = split /:/, $_[0];
$millis += 1000 * $seconds;
$millis += 1000 * 60 * $minutes;
$millis += 1000 * 60 * 60 * $hours;
return $millis;
}然后,我使用从上述例程生成的毫秒来计算两个时间戳之间的时间差(以毫秒为单位)。这一整天都很好,但在午夜时分,当时间戳更改到00:00:00.000时,它就会变得一团糟。因此,任何生成1小时(上午12点到凌晨1点之间)的日志都会得到时间戳差的负值。由于我的时间戳中没有日期,我该如何解决这个问题?我正试图在移动设备上这样做,它没有安装多少perl模块。因此,我无法使用所有可用的perl模块。
发布于 2014-02-25 23:53:36
我想你的时间戳永远不会超过23小时59分钟?
让我们拿两个时间戳A和B。我假设A发生在B之前。
通常,如果A小于B,我知道我可以通过从B中减去A来获得我的时间。然而,在这种情况下,A比B大。现在我得假设我已经在午夜时分结束了。我做什么好?
我知道A和B的区别是A要到午夜,加上B。
例如,A是11:58:30,B是00:02:00
我知道A将在午夜前90秒,而B将在那个时间再增加120秒。因此,总差为90 + 120 = 210秒。
使用你的例行程序:
my $midnight = to_millis( "23:59:00:000" ); # Need the time at midnight
my $a_time = to_millis( $a_timestamp );
my $b_time = to_millis( $b_timestamp );
my $time_diff;
if ( $a_time < $b_time ) { # Normal timestamp issue
$time_diff = $b_time - $a_time;
}
else { # We wrapped around midnight!
my $first_part = $midnight - $a_time; # Time from A to midnight
$time_diff = $first_part + $b_time # We add the time from midnite to B
}发布于 2014-02-25 22:36:47
如果你知道你的两个时间戳的顺序,如果你知道它们之间的间隔不超过24小时,那么如果你得到一个负的差,再加上24小时(86,400,000毫秒)。
如果您没有这些信息,那么您将无法区分2分钟的跨度和24小时2分钟的跨度。
发布于 2014-02-25 22:36:08
您有两个时间戳,A和B。如果B在概念上总是“A”之后,但是从A到B的间隔可能跨越日期边界,那么请执行
if (B < A) B+=86400000然后做减法。或等量
diff = B - A
if (diff < 0) diff+=86400000但是,如果你不能保证B总是“在A之后”,你就必须决定差额的正值和负值的可接受范围。如果超过半天你运气不好,就没有办法解决这个问题,因为你无法判断负间隔代表的是一个真正的负间隔,还是一个正好跨越一天边界的正间隔。
https://stackoverflow.com/questions/22027659
复制相似问题