将YYYYDDD转换为YYYY / MM / DD

时间:2013-08-28 13:33:31

标签: perl

我正在寻找一种方式将YYDDD格式的日期转换为YY / MM / DD。

即。 12212成为12/07/30。

可以在http://www.longpelaexpertise.com.au/toolsJulian.php找到php中的示例,您可以在http://landweb.nascom.nasa.gov/browse/calendar.html找到DDD日历

我很感激有和没有perl模块的任何指导。

谢谢!

编辑:我不是在寻找转换php2perl或类似内容的方法。我只是想找到一种方法,使用perl将YYDDD转换为YY / MM / DD。我更喜欢不使用任何其他perl模块的方法,但如果这是唯一的方法,那么我将欢迎使用perl模块的示例。

3 个答案:

答案 0 :(得分:4)

最好的方法是使用Time::Piece来解析日期并重新格式化,就像这样

Time::Piece->strptime('12212', '%y%j')->strftime('%y/%m/%d')

但遗憾的是,该模块不会以%j格式接受strptime(一年中的某一天)(尽管在strftime中没有问题)。

第二个最佳选项是来自POSIX模块的strftime。字符串必须首先分为年和日,并且年中的日期从零开始,因此必须减去一个,但转换很简单。它可能最好打包为子程序,比如

use strict;
use warnings;

use POSIX 'strftime';

sub yj2ymd {
  my ($year, $yday) = $_[0] =~ /(\d\d)(\d\d\d)/;
  strftime('%y/%m/%d', 0, 0, 0, 0, 0, 2000+$year, 0, $yday-1);
}

print yj2ymd('12212');

<强>输出

12/07/30

如果你期待上个世纪的任何约会,你将不得不做一年中最喜欢的事情。

答案 1 :(得分:3)

我喜欢Time::Piece只是因为它带有Perl,我相信修订版5.10。你会发现很多日期/时间模块,每个人都有他们的最爱,但Time::Piece成为官方发行版的一部分,是时候切换到了。

要使用Time :: Piece,您需要了解strptime STR ing P 屁股 TIME )和{ {3}}( STR ing F ormat TIME )两者都使用%x字母格式来表示时间字符串的某些方面。原因是Time::Piece使用相同的%x格式字符将时间字符串转换为时间对象,有时格式化时间对象进入你的字符串。

来自strftime的联系方式:

  

<强>引用%j

     

一年中的日期,以十进制数字表示(范围001至366)。

  

%Y

     

年份为十进制数,没有世纪(范围00至99)。

现在转换你的日期:

use Time::Piece;

my $old_time = "12212";   #YYddd
my $time = Time::Piece->strptime( $old_time, "%y%j" );
my $new_time = $time->ymd("/"); Now in YY/MM/DD format

糟糕

  

坚持下去 - strptime不会理解%j。这将给出错误的答案。

我没有测试过这个因为我经常使用Time :: Piece,所以我可以在睡梦中做到这一点。我之前从未在%j中使用Time::Piece。 perldoc没有提及%j没有工作,我也没有任何错误。那不好。

新战略。我可以将YYddd字符串解析为年份和日期。然后,我可以将{strong>开始作为01/01/$year。在那之后,我可以花几天时间,把它添加到年份。但是,要正确执行此操作,我需要strftime的常量:

use strict;
use warnings;
use feature qw(say);
use Time::Piece;
use Time::Seconds;

my $old_date = "12212";
$old_date =~ /(..)(.*)/;
my $year = $1;
my $days = $2;

my $time = Time::Piece->strptime("01/01/$year", "%m/%d/%y");
$time += ( ( $days - 1 ) * ONE_DAY);  #01/01/$year is day 1 and not 0

say  $time->strftime("%y/%m/%d");

这会给12/07/30作为答案。


公告

Time::Piece模块的所有者修复了模块中的错误。版本1.23现在有效:

use warnings;
use strict;
use autodie;
use feature qw(say);
use Data::Dumper;

use Time::Piece;

my $old_time = "12212";   #YYddd
my $time = Time::Piece->strptime( $old_time, "%y%j" );
my $new_time = $time->ymd("/"); #Now in YY/MM/DD format
say "Version: $Time::Piece::VERSION";
say $new_time;

打印出来:

Version: 1.23
2012/07/30

答案 2 :(得分:1)

这是一个简短而又甜蜜的方式来做你想做的事情:

#!/usr/bin/perl

use strict;
use Date::Calc qw(Add_Delta_Days);

my $dt = '12212';

my $startYr = 2000 + substr($dt, 0, 2);
my $daysToAdd = substr($dt, 2) - 1;
my ($newYr, $newMo, $newDay) = Add_Delta_Days($startYr, 1, 1, $daysToAdd);

printf("%02d/%02d/%02d\n", $newYr % 100, $newMo, $newDay);