将时间戳转换为 d-m-Y 格式数据 perl

convert timestamp to d-m-Y format data perl

我有以下时间戳:

 2015-06-25 11:27:38.152933+03 

我想把它转换成这样:

 25-06-2015

我如何在 perl 中执行此操作?谢谢

即使这个 answer here 不完全是关于你的问题,你也会找到一种简洁的方法将你的时间戳字符串解析成它的组件(月、年等),然后它应该很简单随心所欲地重新组合在一起。

您可以使用一个简单的正则表达式来获取年、月和日期,然后使用 the sprintf built-in 构建您的日期字符串。

my $timestamp = '2015-06-25 11:27:38.152933+03';
$timestamp =~ m/^(....)-(..)-(..)\s/;
my $date = sprintf '%02d-%02d-%4d', , , ;

这将输出:

25-06-2015

由于您不关心时间和时区,因此不需要成熟的解析器。滚动你自己的非常简单的一个就足够了。

我知道这个问题已经得到解答,但为了将来参考:

use Time::Moment;
say Time::Moment->from_string('2015-06-25 11:27:38.152933+03', lenient => 1)
                ->strftime("%d-%m-%Y");

输出:

25-06-2015

现在您可能认为@simbabque 提供的正则表达式解决方案更快?进行简单基准测试的时间:

#!/usr/bin/perl
use strict;
use warnings;

use Benchmark    qw[];
use Time::Moment qw[];

my $timestamp = '2015-06-25 11:27:38.152933+03';

Benchmark::cmpthese( -10, {
    'regex' => sub {
        $timestamp =~ m/^(....)-(..)-(..)/;
        my $string = sprintf '%02d-%02d-%4d', , , ;
    },
    'Time::Moment' => sub {
        my $string = Time::Moment->from_string($timestamp, lenient => 1)
                                 ->strftime("%d-%m-%Y");
    },
});

结果:

                  Rate        regex Time::Moment
regex        1256682/s           --          -8%
Time::Moment 1368953/s           9%           --

Time::Moment 更快,即使它是一个严格的解析器,它验证给定时间戳字符串的 date/time 组件。为了全面披露,我是 Time::Moment.

的作者