我有以下时间戳:
2015-06-25 11:27:38.152933+03
我想把它转换成这样的东西:
25-06-2015
我怎样才能在perl中执行此操作?感谢。
答案 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的作者。