今だけ人気マンガ100円レンタル特集♪

はじめまして
Perlで日付形式の変換をしたいと思っています。
RFC1123形式(2 Mar 2006 04:28:25 -0800)から
yyyy/mm/dd hh:mm:ssの形式に変換したいのです。
色々と調べましたが、適当なヒントがあるところがありません
でした。
どうぞ、関連サイトでも構いませんので、ご回答お願いいたします。

このQ&Aに関連する最新のQ&A

A 回答 (5件)

CPAN Date::Manip モジュールを使うといいかも


----------------------------------------------------------------
use Date::Manip;
Date_Init("TZ=JST");
$RFC1123 = "2 Mar 2006 04:28:25 -0800";

$date = ParseDate($RFC1123);
if( !$date){
print "error";
} else {
print UnixDate($date,"%Y/%m/%d %H:%M:%S");
}
#result>2006/03/02 21:28:25
    • good
    • 0
この回答へのお礼

ご返事が遅くなり申し訳ありません。
回答あいりがとうございます。

私もCPANモジュールを探してみたんですが、この
モジュールは見つけることができませんでした。

調べが甘いですね・・・・(汗)

本当に助かりました。
試して見ます。ありがとうございます。

お礼日時:2006/03/06 15:00

# 微妙に違うバージョン。



use strict;
my $rfc_date = '2 Mar 2006 04:28:25 -0800';
my %months = ("Jan"=>'01', "Feb"=>'02', "Mar"=>'03', "Apr"=>'04', "May"=>'05', "Jun"=>'06', "Jul"=>'07', "Aug"=>'08', "Sep"=>'09', "Oct"=>'10', "Nov"=>'11', "Dec"=>'12');

if (my @fulldate=$rfc_date=~/(\d{1,2})\s(\w{3})\s(\d{4})\s(\d{2}:\d{2}:\d{2}).+/){

my ($day,$month,$year,$time)=@fulldate;
$day = "0$day" if length $day==1;

my $date = "$year/$months{$month}/$day $time";
print "date=$date\n";
}

# 出力: date= 2006/03/02 04:28:25
    • good
    • 1
この回答へのお礼

ご回答、ありがとうございます。

正規表現は苦手なので勉強になりました。
ありがとうございます。

お礼日時:2006/03/06 15:05

ちょっと検索したら、こんなのが見つかりました。



HTTP::Date - 日付変換ルーチン

既に見られてるかもしれませんが。

参考URL:http://homepage3.nifty.com/hippo2000/perltips/HT …
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

この頁は見ました。
使える!と思ったのですがモジュールのダウンロード頁への
リンクが死んでたので、諦めました。

ありがとうございました。

お礼日時:2006/03/06 15:05

# deagle さんのおっしゃったことを実行しただけですが・・・



use strict;
my $rfc_date = '2 Mar 2006 04:28:25 -0800';
my %months = ("Jan"=>1, "Feb"=>2, "Mar"=>3, "Apr"=>4, "May"=>5, "Jun"=>6, "Jul"=>7, "Aug"=>8, "Sep"=>9, "Oct"=>10, "Nov"=>11, "Dec"=>12);

if ($rfc_date=~/(\d{1,2})\s(\w{3})\s(\d{4})\s(\d{2}:\d{2}:\d{2}).+/){
my $date = "$3/$months{$2}/$1 $4";
print "date=$date\n";
}
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

わざわざ、例を掲載していただきありがとうございます。

私も一時期は正規表現で考えようかと思ったのですが・・・

でも、勉強になりました。
ありがとうございます。

お礼日時:2006/03/06 15:04

 正規表現で分解して、月の名前だけ連想配列で置き換えるのが一番早いと思いますよ。


 俺はそうしました。

 yyyy/mm/dd hh:mm:ss 形式を time 関数の値に変換するロジックなら提供できますよ。
    • good
    • 0
この回答へのお礼

ご返答が遅くなり申し訳ありません。

助かりました。
後のご回答にCPANモジュールのものを頂いたので、
そちらで試してみたいと思っています。

でも、助かりました。
ありがとうございました。

お礼日時:2006/03/06 15:02

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qひとつの命令を複数行に記述

検索してもあまり解説見かけないなぁと思うのですが、(どこが本家かわからないのでとりあえず放置)

VBでいう_に該当するものは何ですか?
ソースが長くなって見にくくなっているので、対処したいのですが。

hoge = "じゅげむじゅげむごごうのすりきれ" _ '←次の行に送る
& "かいじゃりすいぎょのうんらいまつふうらいまつすいぎょうまつ" 

Aベストアンサー

Perlは、VBと異なり行の概念がありません。
VBではステートメント区切り子が存在しないため、改行がステートメントの区切りとして扱われ、例外的につなげるときに「_」を使うわけですが、
Perlの場合はステートメント区切り子セミコロン「;」がステートメントの区切りになっていますので、セミコロンを打たない限り、何行に分かれてもひとつのステートメントとして扱われます。
したがって、回答としては「そのまま改行してOK」です。
上記の例なら、

$hoge = "じゅげむじゅげむごごうのすりきれ" .
"かいじゃりすいぎょのうんらいまつふうらいまつすいぎょうまつ";

という感じです。
当然ながら、文字列中での改行はダメなので、上記のようにいったん「"」を閉じて、文字列結合演算子「.」で接続することに成ります。

Q1桁の日付に0を付ける

日時を取得して、表示する際に「2010/3/16」を、→「2010/03/16」
のように数字が1桁の時だけ「0」を足して表示させたいのですが
どのようにすれば良いでしょうか。
-------------------------------------
($sec,$min,$hour,$day,$mon,$yea,$wdy,$yday,$isdst) = localtime(time);
$year = $yea + 1900;
$mon++;

$nitiji= join("","$year/$mon/$day"," ","$hour",":","$min");
-------------------------------------
上記の方法で、perlで書き出したhtmlに「$nitiji」を埋め込んで表示させているのですが
「0」をつけることができず困っております。
(システム上、そのようにしたいので)

できれば「print(・・・」「「printf(・・・」」などの形式ではなく
「$nitiji」に直接その数値を入れられると良いのですが。
良い方法がありましたら宜しくお願いします。

日時を取得して、表示する際に「2010/3/16」を、→「2010/03/16」
のように数字が1桁の時だけ「0」を足して表示させたいのですが
どのようにすれば良いでしょうか。
-------------------------------------
($sec,$min,$hour,$day,$mon,$yea,$wdy,$yday,$isdst) = localtime(time);
$year = $yea + 1900;
$mon++;

$nitiji= join("","$year/$mon/$day"," ","$hour",":","$min");
-------------------------------------
上記の方法で、perlで書き出したhtmlに「$nitiji」を埋め込んで表示させているの...続きを読む

Aベストアンサー

($sec,$min,$hour,$day,$mon,$yea,$wdy,$yday,$isdst) = localtime(time);
$nitiji = sprintf("%04d/%02d/%02d %02d:%02d", $year + 1900, $mon +1, $mday,$hour,$min);

QPerlで特定行から特定行までを抜き出したい

皆さんのお知恵をお貸し頂ければ幸いです。

Perlで以下のようなことをしたいと考えています。
例えば、次のようなテキストファイルがあったとします。

example.log
==================================
aaaa
hogehoge
test
okok
perl
script
==================================

上記ファイルを読み込んで、「hogehoge」から「perl」の間に挟まれた行だけ抜き出したいのです。
イメージとしては、読み込んだファイルを配列に入れて、一行づつ読ませ、キーワード「hogehoge」が現れたらそこでフラグを立て、それ以降の行を表示し、キーワード「perl」が現れた時点で表示を止めるという処理になるのかな?と思っています。

このような場合、どういう風にすればいいのでしょうか?
恐れ入りますが、ご教授頂ければ幸いです。

それでは、どうぞよろしくお願い致します。

Aベストアンサー

> 一行づつ読ませ、キーワード「hogehoge」が現れたらそこでフラグを立て、それ以降の行を表示し、キーワード「perl」が現れた時点で表示を止めるという処理になるのかな?と思っています。

それでいいと思いますよ?これをそのままコード化すると、こんな感じでしょうか。(No.1さんのとはちょっと結果が違います。)

open FH, "example.log" or die $!;
$flag = 0;
while ($data = <FH>) {
  chomp $data;
  if  ($data eq "hogehoge") { $flag = 1 }
  elsif ($data eq "perl")    { $flag = 0 }
  elsif ($flag) { print "$data\n" }
}
close FH;

で、もっと略したいPerlな人だとこんな感じ。Perl独特の記法がふんだんに使われているので、勉強するには不向きかもしれませんが^^;

open FH, "example.log" or die $!;
while (<FH>) {
  print if /^hogehoge$/ .. /^perl$/ and !/^(?:hogehoge|perl)$/;
}
close FH;

※インデントに全角空白を使っているので、コピーする場合はタブなどに置換して下さい。

> 一行づつ読ませ、キーワード「hogehoge」が現れたらそこでフラグを立て、それ以降の行を表示し、キーワード「perl」が現れた時点で表示を止めるという処理になるのかな?と思っています。

それでいいと思いますよ?これをそのままコード化すると、こんな感じでしょうか。(No.1さんのとはちょっと結果が違います。)

open FH, "example.log" or die $!;
$flag = 0;
while ($data = <FH>) {
  chomp $data;
  if  ($data eq "hogehoge") { $flag = 1 }
  elsif ($data eq "perl")    { $fl...続きを読む

Q日付の比較について

いつもお世話になります。
ファイルに記述された日付に7日を加算した値とlocationtimeで取得した値を比較したいのですが、記述方法が分かりません。
<ファイルは下記のようになっております。>
2006<>03<>28<>明細
これに7を加算した(7日後という意味です)locationtimeでreturn "$year/$mon/$day";の戻り値と比較した比較したいのですが、
どのようにしたらよいのでしょうか?
どなたかご教示お願いいたします。

Aベストアンサー

# あ、こういうことですか?
# まだ違ってたりして・・

use strict;

my $date1='20060328';
my $date2='2006/04/05';
$date2=~ s{\/}{}g;

if($date1 <= $date2){
print '$date1 <= $date2';
}else{
print 'else';
}

QPerl 時間同士の差

恐れ入ります。
Perlを使って、時間と時間の差を求めたいのですが、
なかなかうまくいきません。

一度、txtファイルに書き込み日時を保存したあと、
それをperlにて読み込み、現在時刻との差を出して投稿制限を掛けたいのですが、
どのようにしたらよろしいでしょうか。

現在書き込み日時はtxtファイルに保存し、cgiファイル上に、出力済みで、localtimeも出力済みです。
単純に引いて関数に代入しても、正しい時間を得られません。

よろしくお願いします。

Aベストアンサー

まず、次の点を意識してください。
○ Perlにとっては、それは「ただの文字列」であって、「時刻」などではない
○ 文字列を数値演算しようとすると、「先頭の数値と見做せる箇所」が表す数値に変換される

$ip[1]='2013-02-12 17:03:45'
$time='2013-02-12 20:27:26'
の場合
$time=$time-$ip[1];
これは
・ - による数値演算 → 両辺は数値と見做す
・ '2013-02-12 20:27:26' → これは只の文字列。先頭の2013だけが数値と見做せるので、 2013 という数値に変換
・ '2013-02-12 17:03:45' → これは只の文字列。先頭の2013だけが数値と見做せるので、 2013 という数値に変換
→$time= 2013 - 2013 = 0
となり、その「0」と出力されるのが「Perlとして正しい動作」です。


日付の計算をしたいのなら
○DateTimeモジュール等を利用する
○$ip[1]を分解して、timelocal等で epoch秒を計算、 localtimeと比較する
○$ip[1]を分解して、$sec,$min,$hour,$mday,$mon,$yearとそれぞれ比較、集計して差を求める
等の手段を使う必要があります。

まず、次の点を意識してください。
○ Perlにとっては、それは「ただの文字列」であって、「時刻」などではない
○ 文字列を数値演算しようとすると、「先頭の数値と見做せる箇所」が表す数値に変換される

$ip[1]='2013-02-12 17:03:45'
$time='2013-02-12 20:27:26'
の場合
$time=$time-$ip[1];
これは
・ - による数値演算 → 両辺は数値と見做す
・ '2013-02-12 20:27:26' → これは只の文字列。先頭の2013だけが数値と見做せるので、 2013 という数値に変換
・ '2013-02-12 17:03:45' → これは只の文字列。先頭の...続きを読む

Qyyyymmddからyyyy/mm/ddへの変換

いつもお世話になっております。
Aと言う変数にはyyyymmddの値が入っていて
Aをyyyy/mm/ddにしてBの変数に入れたい場合の処理がわかりません。
調べたところ、SimpleDateFormatクラスと言うものを使えばよいと言うことが判明しました。
しかし、今まで使ったことがないのでよくわかりません。
変数Aと変数BはどちらもString型です。
ご教授お願い致します。

Aベストアンサー

 こんにちは。

 本当に変数aの中の文字列が厳密にyyyyMMddの形式のなっているのなら、普通に

String b = a.substring(0, 4) + "/" + a.substring(4, 6) + "/" + a.substring(6, 8);

 これでいいと思いますが、いったんDate型にする必要があったり、ちゃんと日付として認識できるか確かめる必要がある場合は、

String a = "20051029";

SimpleDateFormat formatter = (SimpleDateFormat)DateFormat.getDateInstance();
formatter.applyPattern("yyyyMMdd");
try {
  Date date = formatter.parse(a);
  formatter.applyPattern("yyyy/MM/dd");
  String b = formatter.format(date);
  System.out.println(b);
}
catch (ParseException ex) {
  System.out.println("解析失敗");
}

 こんな感じでいいんじゃないでしょうか。

 こんにちは。

 本当に変数aの中の文字列が厳密にyyyyMMddの形式のなっているのなら、普通に

String b = a.substring(0, 4) + "/" + a.substring(4, 6) + "/" + a.substring(6, 8);

 これでいいと思いますが、いったんDate型にする必要があったり、ちゃんと日付として認識できるか確かめる必要がある場合は、

String a = "20051029";

SimpleDateFormat formatter = (SimpleDateFormat)DateFormat.getDateInstance();
formatter.applyPattern("yyyyMMdd");
try {
  Date date = formatter.p...続きを読む

QPerlの正規表現で文字の抽出

Perlを勉強しているのですが正規表現についてよくわからないので教えてください。

$text="【件名】本文"

とあるときに、【】で囲まれた文字列(【】も含む)を抽出し、$textに戻したいのですがどうすればいいのでしょうか?
($textの中身を【件名】としたいのです)

よろしくお願いします。

Aベストアンサー

$1が文字化けする件に関して。
それは、日本語の半分(半角英数分のデータ)しか取り出していないからです。正規表現は日本語用に作られていないので、全角文字も半角英数として文字を処理するはずです。
$t="あいう";
@a=split(//,$t);#あいうを一文字ごとに区切り、配列にする
foreach(@a){print $_,"\n";}
を実行すれば分かります。全て文字化けし、ループは6回繰り返されます。(全角3文字=半角6文字)
一応あれは【】の中身を取り出すことのみを考えたものだったので、以下のようにすれば何とかなります。

$text='あは【件名】本文';
$text=~s/(.*)(\【.+?\】)(.*)/$2/;
print $text,"\n";

あは、を取り出したいなら2行目の$2を$1に。本文、を取り出したいなら$3に書き換えてください。正常に出来ると思われます。
ちなみに言い忘れましたが、$数字と言う変数は、本来正規表現内でのみ有効な変数です。普段は使わないように。(print $1;はエラーにはなりませんが、しない方がいいでしょう。)

$1が文字化けする件に関して。
それは、日本語の半分(半角英数分のデータ)しか取り出していないからです。正規表現は日本語用に作られていないので、全角文字も半角英数として文字を処理するはずです。
$t="あいう";
@a=split(//,$t);#あいうを一文字ごとに区切り、配列にする
foreach(@a){print $_,"\n";}
を実行すれば分かります。全て文字化けし、ループは6回繰り返されます。(全角3文字=半角6文字)
一応あれは【】の中身を取り出すことのみを考えたものだったので、以下のようにすれば何とかなりま...続きを読む

Q巨大なテキストの最終行を取得するには

perl v5.10.0 built for i386-linux-thread-multi
OS: Fedora 9 (Linux localhost.localdomain 2.6.25.11-97.fc9.i686 #1 SMP Mon Jul 21 01:31:09 EDT 2008 i686 athlon i386 GNU/Linux)

巨大なテキストファイルの最終行を効率良く取得する方法を探しています。
検索を駆使して 6 日 6 晩試行錯誤したのですが、遂に見付けられなかった為、此所で質問させて頂きます。
私が知っている方法は以下の 3 つですが、何れも環境に依存するか、或いは効率が悪い等の理由で不完全です。

----------------
#!/usr/bin/perl

my $filename = './47GiB.txt';
my $file;

# 1.
print `tail -n 1 $filename`;

# 2.
open $file, $filename;
print +(<$file>)[- 1]; # print pop @{[<$file>]};
close $file;

# 3.
open $file, $filename;
my $pos = 0;
while (<$file>) {
$pos = tell $file unless eof $file;
}
seek $file, $pos, 0;
print <$file>;
close $file;
----------------

tail コマンドの様に、瞬時に最終行を読み出す方法は無いのでしょうか ?
御回答宜しくお願いします。

perl v5.10.0 built for i386-linux-thread-multi
OS: Fedora 9 (Linux localhost.localdomain 2.6.25.11-97.fc9.i686 #1 SMP Mon Jul 21 01:31:09 EDT 2008 i686 athlon i386 GNU/Linux)

巨大なテキストファイルの最終行を効率良く取得する方法を探しています。
検索を駆使して 6 日 6 晩試行錯誤したのですが、遂に見付けられなかった為、此所で質問させて頂きます。
私が知っている方法は以下の 3 つですが、何れも環境に依存するか、或いは効率が悪い等の理由で不完全です。

----------------
#!/us...続きを読む

Aベストアンサー

すみません, 「1回は読まないといけない」はウソです.
一度ファイルの最後までシークして, あとは
・適当な分だけ戻る
・read かなにかで読み込む
・改行があったら, そこからあとを「最後の行」とする
という感じでいけると思います. これだと実行時間はファイル全体の大きさに関係なく, 最後の行の長さにのみ依存するはずです. 最後の行に改行があるかないかまで考えるとちょっと嫌ですが.

QPerlで フォルダ内の全てのファイルを別のフォルダにコピーするには

お世話になります。
多分ご存知の方には簡単な話だと思いますが教えていただけませんか。
Aフォルダにあるhoge.txtをBフォルダにコピーしたければ
use File::Copy;
copy "./A/hoge.txt", "./B/hoge.txt" or die $!;
で出来るのはわかっているのですが、Aフォルダにある全てのファイルをBフォルダにコピーするというのはどのようなコードを書いたらよいのでしょう。
ちなみにAフォルダには100以上ファイルがあります。ファイルは全部テキストファイルです。

Aベストアンサー

$src_dir = "./a";
$dst_dir = "./b";

opendir(DIR, "$src_dir");
my @Files = grep { -f "$src_dir/$_" && /\.txt/ } readdir(DIR);
closedir DIR;

foreach my $file (@Files) {
copy ...
}

こんな感じですかね

Qperlで配列の要素が空なのを知るには?

教えてください。

例えば、perlの次の様な要素が3つある配列で、

@t = ('A',,'C');

2要素目が空で有ることを判別したいのですが、どうしたら良いでしょうか?

Aベストアンサー

'' と比較する.


このカテゴリの人気Q&Aランキング