0

YYDDD 形式の日付を YY/MM/DD に変換する方法を探しています。

つまり、12212 は 12/07/30 になります。

PHP での例はhttp://www.longpelaexpertise.com.au/toolsJulian.phpにあります。DDD カレンダーはhttp://landweb.nascom.nasa.gov/browse/calendar.htmlにあります。

perlモジュールの有無にかかわらず、ガイダンスをいただければ幸いです。

ありがとう!

編集: php2perl などを変換する方法を探しているわけではありません。perl を使用して YYDDD を YY/MM/DD に変換する方法を探しているだけです。追加の perl モジュールを使用しない方法を希望しますが、それが唯一の方法である場合は、perl モジュールを使用した例を歓迎します。

4

3 に答える 3

4

The nicest way would be to use Time::Piece to parse the date and reformat it, like this

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

unfortunately however, the module doesn't accept %j (day of year) in its strptime format (although it is fine in strftime).

The second best option is strftime from the POSIX module. The string has to be split into year and day first, and the day of year is zero-based so one must be subtracted, but then the conversion is straightforward. It is probably best packaged as a subroutine, like this

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');

output

12/07/30

You will have to do something fancier with the year if you expect any dates from last century.

于 2013-08-28T14:13:18.610 に答える
3

私がTime::Pieceを気に入っているのは、Perl に付属しているという理由だけで、リビジョン 5.10 を信じています。何十もの日付/時刻モジュールが見つかり、誰もがお気に入りを持っていますがTime::Piece、公式ディストリビューションの一部になったので、それに切り替える時が来ました.

Time::Piece を使用するには、時間文字列の特定の側面を表すために文字形式を使用するstrptime ( STR ing P ass TIME ) とstrftime ( STR ing Format TIME )について知る必要があります。%xその理由はTime::Piece、同じ%xフォーマット文字を使用して、時間文字列を時間オブジェクトに変換し、場合によってはその時間オブジェクトを文字列にフォーマットするためです。

のマンページからstrftime

%j

10 進数としての年間通算日 (範囲は 001 から 366)。

と:

%y

世紀を含まない 10 進数としての年 (範囲は 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文字列を年と日に解析できます。すると、年の初め01/01/$yearを として取得できます。その後、日を取り、年に追加できます。ただし、これを正しく行うには、Time::Secondsからの定数が必要です。

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
于 2013-08-28T14:07:53.173 に答える
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);
于 2013-08-28T14:41:25.800 に答える