【问题标题】:How to get 'milliseconds' as a part of time in perl? [duplicate]如何在perl中获得“毫秒”作为时间的一部分? [复制]
【发布时间】:2013-08-08 15:24:29
【问题描述】:

我需要以"20130808 12:12:12.123""yyyymmdd hour:min:sec.msec" 的格式获取时间。

我试过了

my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time); 
$year += 1900;
$mon++;
if ($mon<10){$mon="0$mon"} 
if ($mday<10){$mday="0$mday"} 
if ($hour<10){$hour="0$hour"} 
if ($min<10){$min="0$min"} 
if ($sec<10){$sec="0$sec"}  but this doesn't provide the `msec` as a part of time.

我该怎么做?

【问题讨论】:

    标签: perl


    【解决方案1】:

    这是一个完整的脚本。如前所述,它使用Time::HiRes::time 来支持微秒,它还使用POSIX::strftime 来简化格式化。不幸的是strftime 无法处理微秒,因此必须手动添加。

    use Time::HiRes qw(time);
    use POSIX qw(strftime);
    
    my $t = time;
    my $date = strftime "%Y%m%d %H:%M:%S", localtime $t;
    $date .= sprintf ".%03d", ($t-int($t))*1000; # without rounding
    
    print $date, "\n";
    

    如果您不介意使用 CPAN 模块,那么我会推荐出色的 Time::Moment 模块:

    use Time::Moment;
    print Time::Moment->now->strftime("%Y%m%d %T%3f"), "\n";
    

    如果它可以被格式化为 ISO8601 日期,包括时区偏移和微秒而不是毫秒,那么它很简单:

    print Time::Moment->now->to_string, "\n";
    

    【讨论】:

    • 这对我有用..不需要安装任何软件包...谢谢
    • 也可以使用这种类似但略有不同的解决方案:use Time::HiRes qw( gettimeofday );use POSIX qw( strftime );my ($sec, $usec) = gettimeofday();printf( "%s.%03d", strftime( "%Y%m%d %H:%M:%S", localtime $sec ), $usec/1000 );
    • 我没有收到任何语法错误,但在 Perl 5.30.0/Ubuntu 20 上,毫秒对我来说总是为 '000'。
    • @k-den 这很奇怪 --- 我可以在完全相同的 perl/OS 组合上进行测试(Ubuntu 20.04 上的系统 perl),它仍然可以按预期工作。只是一个想法:也许您正在使用时钟做奇怪事情的虚拟化?其他能够返回亚秒级的实用程序呢,例如date +%F%T.%N
    • date 看起来不错。 $ date +%F%T.%N2021-04-1413:41:03.099557465
    【解决方案2】:

    使用Time::HiRes

    简单地看一下,它可以提供自纪元以来的毫秒数 很容易,但似乎没有扩展 localtime(),所以可能需要做一些工作 参与在完整的日历上下文中使用它。

    这是一个工作示例:

    use strict;
    use warnings;
    
    use Time::Format qw/%time/;
    use Time::HiRes qw/gettimeofday/;
    
    my $time = gettimeofday; # Returns ssssssssss.uuuuuu in scalar context
    
    print qq|$time{'yyyymmdd hh:mm:ss.mmm', $time}\n|;
    

    【讨论】:

    • Time::HiRes 是一个核心模块,这意味着它是发行版的一部分。
    • @devnull 谢谢。那我会编辑答案。
    • @devnull & Paul:谢谢。
    • my $time = join '.', gettimeofday; 容易出错,因为在列表上下文中,返回的毫秒数不带前导零(例如,当时间为 1234567890.000123 时,您连接的是 1234567890.123,这是错误的。您只需要 $time = gettimeofday,在标量上下文中已经返回 '1234567890.000123'。
    • 感谢您修复@JackieJames 添加到我的答案中的代码。我希望 Stack Overflow 的软件能够正确地指出归属,而无需搜索编辑内容。
    猜你喜欢
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    • 2017-02-15
    • 2011-04-13
    • 2014-12-02
    • 1970-01-01
    • 2019-08-29
    相关资源
    最近更新 更多