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

时间:2015-11-17 11:06:25

标签: perl time date-format

我有以下时间戳:

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

我想把它转换成这样的东西:

 25-06-2015

我怎样才能在perl中执行此操作?感谢。

3 个答案:

答案 0 :(得分:3)

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

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

这将输出:

25-06-2015

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

答案 1 :(得分:0)

即使这个answer here与您的问题不完全相同,您也会找到一种简洁的方法来将时间戳字符串解析为其组件(月,年等),然后将它们放回原点应该非常简单在一起如你所愿。

答案 2 :(得分:0)

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

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', $3, $2, $1;
    },
    '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更快,即使它是一个严格的解析器,它验证给定时间戳字符串的日期/时间组件。为了充分披露,我是Time :: Moment的作者。