我正在寻找一种方式将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模块的示例。
答案 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);