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

将时间戳转换为d-m-Y格式的数据perl,perl,time,date-format,Perl,Time,Date Format,我有以下时间戳: 2015-06-25 11:27:38.152933+03 我想把它转换成这样的东西: 25-06-2015 如何在perl中实现这一点?谢谢。即使这与您的问题不完全相关,您也会找到一种简洁的方法将时间戳字符串解析为其组件(月、年等),然后将它们重新组合在一起应该非常简单。您可以使用一个简单的正则表达式来获取年、月和日期,然后使用创建日期字符串 这将输出: 25-06-2015 因为您不关心时间和时区,所以不需要完整的解析器。滚动您自己的非常简单的一个就足够了。我知

我有以下时间戳:

 2015-06-25 11:27:38.152933+03 
我想把它转换成这样的东西:

 25-06-2015

如何在perl中实现这一点?谢谢。

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

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

这将输出:

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', $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%           --

速度更快,即使它是一个严格的解析器,用于验证给定时间戳字符串的日期/时间组件。为了充分披露,我是《时间::时刻》的作者。

如何将输出保存到变量?@tsiro我更新了答案。您需要使用
sprintf
而不是
printf
。更安全:
my$date=$timestamp=~m/^(..)-(..)-(..)\s/?sprintf“%02d-%02d-%4d”,$3,$2,$1:undef第一种格式通常更有用,因为它遵循ISO 8601标准。(因此在数字上是可排序的,与几乎所有其他地方相比,美国没有歧义)。我被要求将特定的时间戳转换为这种格式……这不是我的决定……是否有理由否决我?我没有。但当你要求解决一个问题而自己却没有表现出任何尝试时,这并不罕见。
                  Rate        regex Time::Moment
regex        1256682/s           --          -8%
Time::Moment 1368953/s           9%           --