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



我有以下时间戳:

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

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

 25-06-2015

我如何在perl中做到这一点?谢谢

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

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

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

即使这里的答案与您的问题不完全相关,您也会找到一种简洁的方法来将时间戳字符串解析为其组件(月、年等),然后根据需要将它们重新组合在一起应该非常简单。

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

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提供的regex解决方案更快?是时候制定一个简单的基准了:

#!/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更快,尽管它是一个严格的解析器,可以验证给定时间戳字符串的日期/时间组件。为了充分披露,我是《时间:时刻》一书的作者。

最新更新