• 締切済み

Perl 日付処理 逆

Perl 日付処理仕組み $Tm = "1488992820"; my ($Nsec, $Nmin, $Nhour, $Ndate, $Nmon, $Nyear, $Nday) = localtime($Tm); $Nyear += 1900; $Nmon += 1; print "$Nyear/$Nmon/$Ndate"; これで結果は 2017/3/9 となりますが、 逆に 2017 3 上記の年月で 逆に戻したいのですが、 どのようにするのでしょうか? 1488992820のよう細かい日付でなくていいのですが 2017年3月内のlocationTimeに戻したいのです。 説明が下手くそなので、 実際やりたいこと・・・ ログファイル1列目に 1488992820 のように、ログ時間があり、 それをまず 月間別に分け 上記ですと 2017年3月というアンカーを作り <a href="test.cgi?Y=2017&M=3">2017年3月</a> このような感じがページに並び、 これを選択すると ページでそれに該当する行だけ配列に入れ 表示させるということです。 ブログ記事にあるアーカイブ、月間別 を作りたいです ※ログファイルに、予め 2017,3 といったように、書き込むのはなしです。 これは最終手段・・・ 無理やりではありますが value="2017,3," my $a = 0; my @DATA = grep { $DATA[$_] =~ /,2017,3,/ } 0..$#DATA; $a = scalar @DATA ; 一応実行はできております。

  • Perl
  • 回答数1
  • ありがとう数0

みんなの回答

回答No.1

POSIXモジュールのmktime関数を使います。 perl -e 'use POSIX qw(mktime); $time_t = mktime( 0, 7, 2, 9, 3 - 1, 2017 - 1900 );print "$time_t\n"' 1488992820 perl -e 'use POSIX qw(mktime); $time_t = mktime( 0, 0, 0, 9, 3 - 1, 2017 - 1900 );print "$time_t\n"' 1488985200

関連するQ&A

  • エクセルに詳しい方、助けてください!日付を逆の順番にしたいんです。

    このページの時系列データ(このページの時系列データ(http://table.yahoo.co.jp/t?c=1990&a=9&b=25&f=2008&d=6&e=5&g=d&s=998407.o&y=0&z=998407.o)をエクセルに転記したいのです。それも日付の順番を逆にして。できますか?いまだと上から6月4日、3日、2日、と日付をさかのぼっていますが、これを上から たとえば、6月1日、2日、3日....という順番にしたいのです。 理由は、この日経のデータをもうひとつ別の(海外の株式の)データと比較したいのですが、そちらは、日付が上から6月1日、2日、3日、と通常の時系列になっていて、いまのままでは比べられないのです。ひとつひとつ コピペしていけばっべつでしょうが、10年分くらいを検証したいので、それを一つ一つやると、ちょっと....腕が...しにそうなので^^; 一発で日付順をかえることは可能でしょうか? 教えてくださる方 いらっしゃいませんか?

  • Perlの日付の比較に関して

    現在perlを使ってCGIを作っているものです。 まだ、一ヶ月ちょっとの初心者と言うこともあり、 日付の操作の仕方で非常に苦労しています。 入力フォームには、リストボックスでそれぞれ、 ○○○○年 ○○月 ○○日 ○○時 ○○分があり、 フォームが表示されたときには、デフォルトで、本日の日付がセットされるようになっています。 送信ボタンを押す事で入力チェックがかかるのですが、 そのときに、上記の日付のリストボックスの値が、 本日よりも過去になっていたばあいは、エラーを返すと言う処理を作りたいのですが、どうしてもうまくいきません。 本日日付は、localtime関数で取れるのですが、 リストボックスにセットされている値を日付に変換する方法、 また、比較の仕方がさっぱりわかりません。 誰かわかる方がいましたら、ご教授ください。 具体的なソースも書いていただけると大変ありがたいです。 以上よろしくお願いします

    • ベストアンサー
    • Perl
  • 日付チェック関数について

    いつもお世話になっております。 先日、『YYYY/MM/DD』形式から年・月・日を取り出し、整数にする質問をさせて頂き、無事に行うことができました。 ありがとうございます。 再びの質問で恐縮ですが、どうか教えてください。 先日の質問に引き続き、日付の妥当性をチェックする関数を考えています。そこで、「http://f4.aaa.livedoor.jp/~pointc/log453.html」というサイトを見つけたのですが…。 その中で、"20020101"という文字列を『strncat』で分割し、『atoi』してから『tm構造体』へ代入しています。 この『tm構造体』というものがよく分かりません。 調べて見ると、『time()』関数にて取得した暦を『localtime()』関数を使ってローカルタイムに変換し、その値が『tm構造体』となって戻ってくる。というようなことが書いてあります。(正しい理解ができているか、不安なところですが。) なぜ、『tm構造体』へ代入しただけで、日付を算出できるのでしょうか?『tm構造体』は『localtime』関数の戻り値ではなく、単体で利用できるのでしょうか。他に関数というかライブラリ関数のようなものは見当りません。 『tm構造体』自体が計算か何かをしているのでしょうか? 乱文で申し訳ありません。 どうかご協力お願いいたします。

  • Perlの日付取得で月の表示がおかしい

    下記は、メールフォームCGIに書き込まれた日時などの情報をlog.cgiというファイルに書き出すスクリプトです。 2012/01/04 21:05:45 のような感じで、日付が刻まれるのですが、このうち月の部分がどの月に処理を行ってもいつも01になってしまうのですが、当方直し方がわかりません。 下記が実際の記載箇所です。4行目がおかしいのだと思いますが、どなたかお分かりの方、教えていただけないでしょうか。 my $path = "log.cgi"; my $ip = $ENV{'REMOTE_ADDR'}; ($sec, $min, $hour, $mday, $month, $year, $wday, $stime) = localtime(time()); my $time = sprintf("%04d\/%02d\/%02d %02d\:%02d:%02d", $year + 1900, $mon + 1, $mday, $hour, $min, $sec); my $message = $in{'メッセージ'}; $message =~ s/\r\n/ /g; $message =~ s/\n/ /g; if (open(FOUT, ">> $path")) { print FOUT "$time\t$ip\t" . $in{'お名前'} . "\t" . $in{'E-mail'} . "\t" . $message . "\r\n"; close(FOUT); } よろしくおねがいいたします。

    • ベストアンサー
    • Perl
  • ExcelデータをWordに差込…日付が逆に…

    Microsoft Office2003を使用しています。 ExcelデータをWordに差込むと日付が逆に表示されてしまいます。 Excelデータ   2006/7/12(日付) Wordに差込むと  12/7/2006という表示なってしまいます。 なぜでしょうか? Excelデータを 平成18年7月12日等に表示を変更しても12/7/2006         という表示になってしまいます。 どうぞよろしくお願い申し上げます。

  • Perlの書き方

    $addr = $ENV{'REMOTE_ADDR'}; open(IN,"$log"); my @data = <DATA>; foreach(@data){ my($ip)=split(/\,/,$_); if($ip==$addr){$a=1;} if ($a !=1) { 処理1 } else { 処理2 } } close(DATA); $logに$addrが含まれている場合は処理2を実行させたいと↑のスクリプトを書いてみました。私の環境(パソコンの環境と、設置サーバーの環境)では正常に動いているようですが、人に(パソコンの環境と、設置サーバーの環境)よっては、処理1が実行されてしまうようです。書き方は、これで間違っていませんでしょうか? もし間違っていないのでしたら、環境によって$logに$ipが記録されていないのかも知れません。perlの知識はあまりありませんが、よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • Perl BBS 掲示板 改行処理

    改行処理について教えてください。 今まで書き込み処理で unshift @DATA, "$tm,$FORM{'name'},$FORM{'title'},$FORM{'text'}\n"; としていたのですが、これを use CGI; my $form = new CGI; my $NAME = $form->param('name'); my $TITLE = $form->param('title'); my $TEXT = $form->param('text'); unshift(@DATA,"$tm,$NAME,$TITLE,$TEXT\n"); に変更しました。 すると sub loadFormdata が聞かなくなり、 改行処理他が対応しなくなってしまいました、 この場合、 loadFormdataの部分のどこを変えればよいでしょうか? |------書き込み処理------| sub printdata{ use CGI; my $form = new CGI; &loadFormdata(); open(FILE, "<$FILE"); eval{ flock(FILE, 1) }; @DATA = <FILE>; close FILE; my $tm = time; my $NAME = $form->param('name'); my $TITLE = $form->param('title'); my $TEXT = $form->param('text'); unshift(@DATA,"$tm,$NAME,$TITLE,$TEXT\n"); while(@DATA > $MAX) { pop @DATA; } open(FILE, ">$FILE") or die("error :$!"); eval{ flock(FILE, 2) }; print FILE @DATA; close FILE; } |------改行処理他------| sub loadFormdata { my ($query, $pair); if($ENV{'REQUEST_METHOD'} eq 'POST') { read(STDIN, $query, $ENV{'CONTENT_LENGTH'}); } else { $query = $ENV{'QUERY_STRING'}; } foreach $pair (split(/&/, $query)) { my $key = ("$NAME,$TITLE,$TEXT"); my ($key, $value) = split(/=/, $pair); $value =~ tr/+/ /; $value =~ s/%([0-9a-fA-F][0-9a-fA-F])/chr(hex($1))/eg; $value =~ s/&/&amp;/g; $value =~ s/</&lt;/g; $value =~ s/>/&gt;/g; $value =~ s/\x0D\x0A\s*/<br>/g; $value =~ s/\s+/ /; $FORM{$key} = $value; } }

    • ベストアンサー
    • Perl
  • 日付の加算

    日付Aと日付Bとの差を算出する方法についてはDateDifというのがあるそうですが、 逆に日付AからX年Y月Z日後の日付を算出する関数またはカンタンな処理式があれば教えて下さい。 なお、Excelは97を使用しています。

  • Perl 処理速度について

    ブログを作成し、カテゴリー別に分けたく下記のようなソースを 書きました。 sub category1 { open(FILE, "<$FILE") or die("error :$!"); eval{ flock(FILE, 1) }; @DATA = <FILE>; close FILE; $a = 0; my @category1 = grep(/,1,/, @DATA); while (<@category1>) { $a++; } &buffer(); if($start > @DATA) {$start = @DATA;} $next = $start + 100; $back = $start - 100; if ($back < 0) { $back = 0; } for ($i=$start;$i<$next;$i++){ last if ($i > @category1); $data = $category1[$i]; &page(); } } これの処理速度が遅いのですが、なにか原因はありますでしょうか? 似たような処理で下記のソースの方が、読み込む内容としては多いのですが、 こちらは普通の速度です。 sub diary2017 { open(FILE, "<diary/diary-2017.txt") or die("error :$!"); eval{ flock(FILE, 1) }; @DATA = <FILE>; close FILE; &buffer(); if($start > @DATA) {$start = @DATA;} $next = $start + 1000; $back = $start - 1000; if ($back < 0) { $back = 0; } for ($i=$start;$i<$next;$i++){ last if ($i > @DATA); $data = $DATA[$i]; &page(); } } カテゴリーのサブルーチンとアーカイブ専用のサブルーチンで違う点といえば $a = 0; my @category1 = grep(/,1,/, @DATA); while (<@category1>) { $a++; } このgrepのとこですが、 これが遅いとすると対処方法はありますか? ※開くファイルはアーカイブは直接名前にしてて、カテゴリーは変数を使ってますが  これは同じです。

    • ベストアンサー
    • Perl
  • 日付の受け取り方

    お世話になります。 Postgresに日付TBというテーブルがあります。 日付TBの日付というレコードから、2004-08-01というデータを受け取った場合 PHPで平成16年8月(年月のみ)と表示したいです。 どのような書き方をすればよろしいでしょうか。

    • ベストアンサー
    • PHP

専門家に質問してみよう