【问题标题】:perl regex to cut the microseconds in timestampperl 正则表达式以减少时间戳中的微秒
【发布时间】:2015-01-20 19:09:01
【问题描述】:

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

  $_ = '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;

【问题讨论】:

  • 你试过\..*吗?这似乎是一个微不足道的问题。
  • 我认为.267 最有可能代表几分之一秒而不是微秒,所以在13:58:01.267 的情况下,您可能有 1.267 秒或 1 秒和 267 毫秒,而不是 1 秒和267 微秒。
  • 另外,您应该真的不要丢弃时区信息 (-05:00)。如果没有时区,由于夏令时,您的某些时间戳的答案将不准确。请参阅ikegami's answer 到您询问的上一个问题,了解如何正确执行此操作的一个很好的示例。

标签: regex perl


【解决方案1】:

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

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

如果你不能要求 Perl 5.14+,你需要一些更冗长的东西。

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

(如果你不复制,你最终会修改你传递给map的变量,我认为这是一种非常糟糕的做法。)

写一个小子可能会更好。

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

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

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

【讨论】:

    【解决方案2】:

    (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; 
    

    【讨论】:

    • 我已经更新了我的问题。我正在使用输出来查找时差。使用 s/\..*// 在计算时间差时会出现错误。
    • 这似乎是他的意图,但我已将地图更改为使用非破坏性替换。虽然这需要 5.14。
    【解决方案3】:

    如果您要求正则表达式删除点之后的所有内容,这里是:并且澄清一下,如果您只想要 '.' 之前的所有内容对于字符串:'2015/01/13 13:59:21.267-05:00';

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多