Regex perl正则表达式以减少时间戳中的微秒

Regex perl正则表达式以减少时间戳中的微秒,regex,perl,Regex,Perl,如何在时间戳中使用正则表达式删除/剪切dot(.)之后的所有内容?我想使用输出在下面的代码中查找时间差 $_ = '2015/01/13 13:59:21.267-05:00'; s/\.\d*//; print $_, "\n"; 电流输出: 2015/01/13 13:59:21-05:00 期望输出: 2015/01/13 13:59:21 查找时差的代码: use strict; use warnings; use Time::Piece; my $str1 = '2

如何在时间戳中使用正则表达式删除/剪切dot(.)之后的所有内容?我想使用输出在下面的代码中查找时间差

  $_ = '2015/01/13 13:59:21.267-05:00';
  s/\.\d*//;
  print $_, "\n";
电流输出:

2015/01/13 13:59:21-05:00
期望输出:

2015/01/13 13:59:21
查找时差的代码:

use strict;
use warnings;
use Time::Piece;

my $str1 = '2015/01/13 13:58:01.267-05:00';
my $str2 = '2015/01/13 13:59:21.267-05:00';

my @times = map Time::Piece->strptime((s/\.\d*//), '%Y/%m/%d %H:%M:%S'), $str1, $str2;
my $delta = $times[1] - $times[0];
print $delta->pretty;
(s/\.\d*/)
返回导致错误的替换次数:

my @times = map Time::Piece->strptime((s/\.\d*//), '%Y/%m/%d %H:%M:%S'), $str1, $str2;
在perl 5.14+中使用/r将达到预期效果:

my @times = map Time::Piece->strptime( s/\..*//r, '%Y/%m/%d %H:%M:%S'), $str1, $str2; 
或在perl 5.14之前:

my @times = map { local $_ = $_; s/\..*//; Time::Piece->strptime( $_, '%Y/%m/%d %H:%M:%S') } $str1, $str2; 

替换运算符不返回修改后的字符串。如果希望它这样做,则需要指定
/r
修饰符

map Time::Piece->strptime((s/\.\d*//r, ...), ...

如果您不需要Perl5.14+,那么您需要更冗长的内容

map { ( my $s = $_ ) =~ s/\.\d*//; Time::Piece->strptime($s, ...) } ...

(如果你不做拷贝,你最终会修改你传递给<代码> map < /COD>的变量,我认为这是一个非常糟糕的实践。) 写一篇小文章可能会更好

sub remove_subsecs { ( my $s = $_[0] ) =~ s/\.\d*//; $s }

map Time::Piece->strptime(remove_subsecs($_), ...), ...


或者,您可以使用更好的DateTime(可能需要DateTime::Format::StrTime的帮助)。它不仅支持分数秒和次秒,还可以防止人们在处理日期和时间时犯下许多错误。

如果您要求正则表达式删除点后的所有内容,请参见:并澄清,如果您只希望字符串“.”前面的所有内容:“2015/01/13 13:59:21.267-05:00”

$_=~/\A(.*?)\./is;

$1=点之前的所有内容。

您是否尝试过
\..*
?这似乎是一个微不足道的问题。我认为
.267
最可能代表的是一秒的分数,而不是微秒,因此在
13:58:01.267
的情况下,你可能有1.267秒或1秒和267毫秒,而不是1秒和267微秒。此外,您真的不应该丢弃时区信息(
-05:00
)。如果没有时区,由于夏令时的原因,对于某些时间戳,您的答案将不准确。查看您之前提出的问题,了解如何正确执行此操作的一个很好的示例。我已更新了我的问题。我使用输出来查找时间差。使用
s/\..*/
会给我一个计算时间差的错误。这似乎是他的意图,但我已将地图改为使用非破坏性替代。虽然这需要5.14。