【问题标题】:How to get micro seconds with time stamp in Perl?如何在 Perl 中获得带有时间戳的微秒?
【发布时间】:2015-10-22 01:54:49
【问题描述】:

这可能是一个愚蠢的问题,但我无法找到答案:

我有一个 Python 代码正在打印这样的时间戳:

2015-05-19 22:27:00.688441

产生此字符串的代码如下所示:

print str(datetime.datetime.strptime(time_value, '%Y-%m-%d %H:%M:%S.%f'))

我想在 Perl(5.14 版)中做同样的事情。除了最后一个小数部分(%f),我可以得到这个字符串的所有部分。

如何在 Perl 中获得完全相同的字符串?

PS:我尝试使用Time::HiRes 模块。

use Time::HiRes;
my ($seconds, $microseconds) = gettimeofday;

如果我能以某种方式使用$secondslocaltime(),这可能吗?如果是,那怎么办?

对原始问题的扩展:如果我有一个变量$time_value——假设我已经从某个地方检索到这个变量中的时间戳字符串,我如何将其格式化为所需的格式,即带有微秒的时间戳?

【问题讨论】:

  • 您在尝试使用 Time::HiRes 时遇到了什么问题?重新扩展:$time_value 是什么?
  • 我是 Perl 新手,所以我不确定如何在这种特殊情况下使用 Time::HiRes。我可以按照文档使用它,但不适用于这种情况。

标签: perl


【解决方案1】:

与 Python 最相似的方式是安装和使用DateTime。请注意,微秒不是标准strptime 格式的一部分。 DateTime 使用 %N 表示小数秒。 %6N 表示派系秒到 6 位(微秒)。

# `DateTime->now` uses seconds, so we have to supply our own
# hires time.
use Time::HiRes qw(time);
use DateTime;

print DateTime->from_epoch( epoch => time )->strftime('%Y-%m-%d %H:%M:%S.%6N');

【讨论】:

  • 这段代码给我的输出为:2015-10-20 23:34:10.000000 由于我们最后得到的都是 0,所以有什么遗漏吗?
  • @KedarJoshi Ahh。格式正确,但DateTime->now 没有使用微秒。我会举一个更好的例子。
  • @Schewern :我正在尝试使用我的 $mtime = (stat $filename)[10];我如何将其转换为所需的格式?
  • 问题是 stat 函数将 mtime 返回为自纪元时间以来的秒数。我如何在这里获得微秒?
  • 没关系,明白了。 Time::HiRes 本身有一个“stat”函数
【解决方案2】:
$ perl -E'
   use DateTime qw( );

   my $time = 1445400376.20984;

   my $dt = DateTime->from_epoch( epoch => $time, time_zone => "local" );
   say $dt->strftime("%Y-%m-%d %H:%M:%S.%6N");
'
2015-10-20 21:06:16.209840

(删除 time_zone => "local" 表示 UTC。)

但是 DateTime 有点重。 POSIX 提供了最轻便的解决方案。

$ perl -E'
   use POSIX qw( strftime );

   my $time = 1445400376.20984;

   my $microsecs = ($time - int($time)) * 1e6;
   say sprintf("%s.%06.0f", strftime("%Y-%m-%d %H:%M:%S", localtime($time)), $microsecs);
'
2015-10-20 21:06:16.209840

(对于 UTC,将 localtime 更改为 gmtime。)

如果您还没有时间,可以在第一个 sn-p 中使用 Time::HiRes 的 time,在第二个中使用 gettimeofday

【讨论】:

    【解决方案3】:

    您也可以使用Time::Moment。为了全面披露,我是 Time::Moment 的作者。

    当地时间:

    $ perl -MTime::Moment -E'
    say Time::Moment->now    
                    ->strftime("%Y-%m-%d %H:%M:%S.%6N");
    '
    2015-10-21 19:48:56.333887
    

    UTC 时间:

    $ perl -MTime::Moment -E'                                                                                       
    say Time::Moment->now_utc
                    ->strftime("%Y-%m-%d %H:%M:%S.%6N");
    '
    2015-10-21 17:48:57.805921
    

    【讨论】:

    • 那个模块看起来像我一直在寻找的 DateTime 替代方案。
    • 现在,我可以在我的日志文件中添加时间戳,并以毫秒为单位精确监控事件发生的时间。
    【解决方案4】:

    使用不支持小数秒的 Time::Piece,通过在末尾添加它们:

    use 5.014;
    use warnings;
    use Time::Piece;
    use Time::HiRes;
    
    my ($seconds,$microseconds) = Time::HiRes::gettimeofday;
    my $str = sprintf '%s.%06d', gmtime($seconds)->strftime('%Y-%m-%d %H:%M:%S'), $microseconds;
    

    【讨论】:

    • from_epoch 需要小数秒。
    猜你喜欢
    • 2016-11-22
    • 2016-02-22
    • 2011-10-18
    • 1970-01-01
    • 1970-01-01
    • 2016-04-16
    • 1970-01-01
    • 2014-04-07
    • 1970-01-01
    相关资源
    最近更新 更多