在 Windows 上的 perl 中将纪元转换为本地时间

Posted

技术标签:

【中文标题】在 Windows 上的 perl 中将纪元转换为本地时间【英文标题】:Convert epoch to local time in perl on windows 【发布时间】:2016-02-09 06:25:42 【问题描述】:

我们正在尝试转换从以下代码接收到的输出

当前输出就是这种形式

testingwindows,1446727960,1446728560,kkulka11,testingwin
testingwindows1,1446727160,141228560,kkulka11,testingwin
testingwindows2,1446727120,1446728560,kkulka11,testingwin
testingwindows3,1446727960,1446728560,kkulka11,testingwin

所需的输出类似于

testingwindows from Fri Oct  3 13:51:05 2015 GMT to Mon Nov  9 13:51:05 2015 GMT by kkulka11 for testingwin.
testingwindows1 from Fri Oct 2 13:51:05 2015 GMT to Mon Nov  9 13:51:05 2015 GMT by kkulka11 for testingwin.
testingwindows2 from Fri Oct 2 13:51:05 2015 GMT to Mon Nov  9 13:51:05 2015 GMT by kkulka11 for testingwin.
testingwindows3 from Fri Oct 12 13:51:05 2015 GMT to Mon Nov  9 13:51:05 2015 GMT by kkulka11 for testingwin.

这是我当前的代码

if ( $COMMAND eq 'queryone' ) 
    my $msend_query = "$MCELL_HOME\\bin\\mquery";
    my @args_query = (
        $msend_query,
        "-q",
        "-c", "$MCELL_HOME\\etc\\mclient.conf",
        "-n", "$CS_BLACKOUT_CELL",
        "-d",
        "-f", "csv",
        "-a", "CS_EMB_GBF_BLACKOUTS" ,
        "-s", "blackout_host,start_timestamp,stop_timestamp,userid,reason",
        "-w", "blackout_host: == '$BLACKOUTHOST'"
    );
    system(@args_query);

我们尝试使用perl -pe 's/(\d10)/gmtime($1)/e';,但无法转换并出现此错误

'o~go⌂⌂t⌂x⌂w' 未被识别为内部或外部命令, 可运行的程序或批处理文件。

当我们使用代码时

if ( $COMMAND eq 'queryone' ) 
    my $msend_query = "$MCELL_HOME\\bin\\mquery";
    my $mqt = "$MCELL_HOME\\mqt.pl";
    my @args_query = (
        $msend_query,
        "-q",
        "-c", "$MCELL_HOME\\etc\\mclient.conf",
        "-n", "$CS_BLACKOUT_CELL",
        "-d",
        "-f", "csv",
        "-a", "CS_EMB_GBF_BLACKOUTS",
        "-s", "blackout_host,start_timestamp,stop_timestamp,userid,reason",
        "-w", "blackout_host: == '$BLACKOUTHOST'"
    ) | $mqt;
    system(@args_query);

需要专家快速帮助和指导以实现人类可读格式的输出。

编辑:

根据 Jacob cmets 更新了代码,但仍未收到所需的输出。请推荐

if ( $COMMAND eq 'queryone' ) 
    my $msend_query = "$MCELL_HOME\\bin\\mquery";
    my @args_query = (
        $msend_query,
        "-q",
        "-c", "$MCELL_HOME\\etc\\mclient.conf",
        "-n", "$CS_BLACKOUT_CELL",
        "-d",
        "-f", "csv",
        "-a", "CS_EMB_GBF_BLACKOUTS" ,
        "-s", "blackout_host,start_timestamp,stop_timestamp,userid,reason",
        "-w", "blackout_host: == '$BLACKOUTHOST'"
    );
    chomp;
    my @parts = split(/,/, system(@args_query));
    $parts[1] = localtime($parts[1]);
    $parts[2] = localtime($parts[2]);
    printf("%s from %s to %s by %s for %s\n", @parts);

输出:

M:\AbhayBackup\PerlKK>test.pl -q -h testingwin
testingwin
sub: testingwin
testingwin,1446727960,1446728560,kkulka11,testingwin
0 from Thu Jan  1 05:30:00 1970 to Thu Jan  1 05:30:00 1970 by  for

【问题讨论】:

... ) | $mqt; - 您正在对命令字符串进行按位或运算。这没有任何意义。 “正确”如何?我不知道你的代码在那里试图做什么。你为什么首先把按位运算放在那里? 我认为你不明白你的代码在做什么。 那你要么复制粘贴不正确,要么你输入的不是你说的那样。您可以在我的回答中看到完整的输入和输出! 您可能还想订购this book 并在结帐时选择隔夜送达。 【参考方案1】:
while (<DATA>) 
    chomp;

    my @parts = split(/,/, $_);
    $parts[1] = localtime($parts[1]);
    $parts[2] = localtime($parts[2]);

    printf("%s from %s to %s by %s for %s\n", @parts);


__DATA__
testingwindows,1446727960,1446728560,kkulka11,testingwin
testingwindows1,1446727160,141228560,kkulka11,testingwin
testingwindows2,1446727120,1446728560,kkulka11,testingwin
testingwindows3,1446727960,1446728560,kkulka11,testingwin

输出:

testingwindows from Thu Nov  5 05:52:40 2015 to Thu Nov  5 06:02:40 2015 by kkulka11 for testingwin
testingwindows1 from Thu Nov  5 05:39:20 2015 to Sun Jun 23 07:09:20 1974 by kkulka11 for testingwin
testingwindows2 from Thu Nov  5 05:38:40 2015 to Thu Nov  5 06:02:40 2015 by kkulka11 for testingwin
testingwindows3 from Thu Nov  5 05:52:40 2015 to Thu Nov  5 06:02:40 2015 by kkulka11 for testingwin

编辑:根据您对问题的最新更新,我现在相信您正在尝试捕获命令的输出并对其进行处理。由于您没有提供minimal, complete, and verifiable example,而且我不知道mquery 是什么,并且您也没有对此提供解释,所以我向您提出这个猜测:

if ($COMMAND eq 'queryone') 
    my @lines = `$MCELL_HOME\\bin\\mquery -q -c $MCELL_HOME\\etc\\mclient.conf -n $CS_BLACKOUT_CELL -d -f csv -a CS_EMB_GBF_BLACKOUTS -s blackout_host,start_timestamp,stop_timestamp,userid,reason -w blackout_host: == '$BLACKOUTHOST'`;

    for (@lines) 
        chomp;

        my @parts = split(/,/, $_);
        $parts[1] = localtime($parts[1]);
        $parts[2] = localtime($parts[2]);

        printf("%s from %s to %s by %s for %s\n", @parts);
           

【讨论】:

请求时区缩写也在输出中 @ysth 好点。他还在主题中说“当地时间”,然后在他的代码中使用gmtime(),所以我真的不知道他想要什么。 @MattJacob 你的输出是正确的,我们需要它以类似的方式,但不确定我们在哪里做错了,所以它没有达到预期 好吧,我也不确定。也许您应该编辑您的问题以显示您在做什么。 根据您的建议用结果更新了问题,但仍未收到预期的结果

以上是关于在 Windows 上的 perl 中将纪元转换为本地时间的主要内容,如果未能解决你的问题,请参考以下文章

在 Perl 中将纪元时间转换为标准约定的问题

如何在 Perl 中将纪元时间转换为正常时间?

如何在 Perl 中将 dd/mm/yyyy 转换为纪元时间?

在perl中将日期转换为纪元的最佳方法[关闭]

Perl 将自纪元以来的微秒转换为本地时间

如何使用 Perl 将纪元时间转换为 UTC 时间?