• 締切済み

localtimeについて

perlを使っています。 localtime関数を使って時間をウェイブで表示しようと思っています。代替成功はしたのですが下記のことに問題があります。  2001年1月4日2時5分(現状)  2001年01月04日02時05分(要望) にしたいのですがどのようにすればできるのか教えていただけないでしょうか?  又、2001年01月04日02時05分をいちれつにつなげる事、つまり(2001010405)というように一列につなげることはできるのでしょうか?  どうか教えてください。お願いします。    

  • gcc
  • お礼率8% (10/125)
  • CGI
  • 回答数4
  • ありがとう数1

みんなの回答

  • enzo_5150
  • ベストアンサー率24% (8/33)
回答No.4

関数をうまく組み合わせれば1行でできちゃうんですね~すごい!(常識?) 関数をあまり知らないので、いつも変数を1つずつ処理してました。 勉強になります。 分割の方法なんですが、kokucho81さんの書かれてる通りですね。 「=~」はマッチ演算子で/^(....)(..)(..)(..)(..)$/というパターンで 左側の変数に代入します。 「.」(ドット)は「\n」(改行)以外の文字にマッチしますので、 意味合い的には最初の4文字を$year2に、次の2文字を$month2に・・・って 感じになります。(「^」が文字列の頭、「$」が文字列の末尾を指定しますので、 このパターンマッチは12文字の文字列にしかマッチしません) うまく説明できませんが、いけそうですか? kokucho81さん、間違ってましたらフォローお願いします(^^;

  • kokucho81
  • ベストアンサー率61% (157/255)
回答No.3

普通なら、以下のように処理します。 ########## 0を頭につけて2桁にする処理 ########## map { $_=sprintf("%02d",$_) } ($month,$day,$hour,$min); ########## 連結 ########## $xxxx=$year.$month.$day.$hour.$min; ########## 分解 ########## ($year2,$month2,$day2,$hour2,$min2)=$xxxx=~/^(....)(..)(..)(..)(..)$/;

  • enzo_5150
  • ベストアンサー率24% (8/33)
回答No.2

ごめんなさい、  $xxxx = $year.$month.$hour.$min; に $dayが抜けてました。  $xxxx = $year.$month.$day.$hour.$min; です。

gcc
質問者

お礼

す、すごいです。 いとも簡単にできてしました。 $xxxx = $year.$month.$day.$hour.$min; の中で $xxxxをまた年月日に分解することもできるのでしょうか?お願いします。

  • enzo_5150
  • ベストアンサー率24% (8/33)
回答No.1

現状の「2001年1月4日2時5分」の変数部分が、 仮に$year、$month、$day、$hour、$minとしたら、  if($month < 10) {    $month = "0".$month;  }  if($day < 10) {    $day = "0".$day;  }  if($hour < 10) {    $hour = "0".$hour;  }  if($min < 10) {    $min = "0".$min;  } などとしてやれば、要望通りになると思います。 また、一列につなぐのも、  $xxxx = $year.$month.$hour.$min; と連結してやればいいと思います。

関連するQ&A

  • localtimeについて

    C言語のlocaltimeについて質問です。 ファイルから通算秒の値を読み込み、それを構造体2次元配列に格納し、locatime関数で日付を計算したいんです。 しかし、うまく変換できていないようで想定していない日付になってしまいます。 例えば typedef struct TIME { time_t time; } TIME; struct tm *s; long time1; ←ファイルから読み込んだ通算秒が格納されている TIME t[5][10]; for(i=0; i<5;i++) { for(j=0;j<10;j++) { t[i][j].time = time1; s = localtime(&t[i][j].time); /* (1) */ printf("時 : %d\n",s->tm_hour); printf("分 : %d\n",s->tm_min); } } printfで時間と分を出力すると時間が11時間ほどずれています。 (1)があやしいと思うのですが、間違いがわからないので、どうかご教授ください!

  • 漢字交じり文字列からのlocaltimeの求め方

    perlのCIGを改造してエラーチェック機能をつけようとしています。 htmlのフォームから「2004年5月16日登録」とか「2005年12月22日削除」といった文字列が送られてくるのですが、ここから数字部分だけ抜き出してlocaltimeに直し、改造前からcgiに備わっている($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);で割り出した数値と比較して例えばif $hikaku>localtime...errorといった形でエラーを返すようにしようとしています。 ここで、フォームから送られたデータから「2004」を抽出するには @kirokunen = split(/年/,$hiduke); $nenn = $kirokunen[0]); 「5月」の5を抽出するには2004を抽出した残りを利用して @kirokugatu = split(/月/,$kirokunen[1]); $gatu = $kirokugatu[0]); 同様に @kirokuniti = split(/日/,$kirokugatu[1]); $gatu = $kirokuniti[0]); として $hikaku = timelocal($sec, $min, $hour, $niti, $gatu - 1, $nenn); としてtimeを求めようとしたのですが、年号だけは抽出できたのに、月や日は、表面上は「5」とか「16」と言った具合にちゃんと数字だけになっているのに、timelocalの式に代入するとinternal server errorになってしまいます。 これは何がいけないのでしょうか? 他の部分の改造は手に負えないので、フォームから送らせるデータの方は直さず、「2004年5月16日登録」の形からtimelocalを求めるにはどうしたらよいのでしょうか?

    • ベストアンサー
    • Perl
  • perlで変数をunix時間から時刻表示に変換したいがうまくできない

    変数に入ったUNIX時間を下記のようなperlコマンドで普通の時刻表示に変換したいのですが、 変数がうまく展開できません。 (↓のままだと、1970年1月1日になります) 'や"や\を組み合わせたらどうにかなるかと思うのですが、どうすればいいでしょうか? #! /bin/sh UX_TIME=113423423 perl -e 'print localtime($UX_TIME) . "\n"' exit 0 以上、よろしくお願いします。

  • エクセルで、ある特定の一列だけ、行数の多い列であり、他列と比べ多い行数

    エクセルで、ある特定の一列だけ、行数の多い列であり、他列と比べ多い行数分だけを削除する 関数をご教示下さい。 わかりにくいと思いますので、画像も添付します。

  • ユニックス時間(秒)を普通の日付時間(時:分:秒)に直すにはどうすればいいでしょうか。

    こんにちわ。質問させて頂きます。 C言語で、pcap.hによってキャプチャされたパケットのタイムスタンプ(秒)を、標準時間と申しますか、時:分:秒に直したいと考えています。 時間変換の関数で、ctime,asctime,localtime等があるのは分かっているので、localtime関数を使おうと思っているのですが、使ってみたところポインタのタイプが違うのでエラーが出てしまいます。 具体的には、 方法(1):time_t変数に代入してやってみる struct tm *t_st; time_t timer; timer = header->ts; t_st = localtime (&timer); 方法(2):localtime関数に直接放り込む t_st = localtime (&header->ts); 等を試してみたのですが当然アウトでした。 パケットヘッダの中の時間を表すheader->tsをどうにかlocaltime関数で使いたいと考えています。 これを解決する良い方法はあるでしょうか。 ご存知であればご教授いただけないでしょうか。どうぞよろしくお願いします。

  • 記録されている時間から何日経ったか表示したい

    CGI(perl)勉強中です。 2012年12月18日22時15分 のように文字列で記録されている時間があります。 (事情によりこの時刻は上記のような文字列型式でしか記録できません) この時間が、現在時刻と比較し、何日経過しているかを表示させたいと思っています。 time 関数を使えば現在時刻の取得が可能ということは分かりました。 この現在時刻から上記の日時をマイナスすれば経過秒数が分かり、 これを日数に計算しなおせばできると思うのですが、 2012年12月18日22時15分をtime関数で取得した現在時刻と同じ型式に 変換させる方法が分かりません。 また、他によい計算方法があればよろしくお願いします。

    • ベストアンサー
    • Perl
  • 年月日の数値化?

    time関数とlocaltime関数で、現在の年月日を取ることはできるのですが、逆に年月日を与えてその数値(秒で表せる等)を取る関数はありますか? つまり2000年10月30日から今日2000年12月7日までの数値を引き算で計算させたいのです。 質問が分かりにくくてごめんなさい。

    • ベストアンサー
    • Perl
  • エクセルの関数について質問

    次のような表を考えているのですが関数をどうすれば良いか教えてください エクセルのバージョンは2003です。 ・下記の4列目に2013年3月31日時点におけるに入社してからの年数を関数で計算させたい ・下記の5列目に4列目が10年以下の人は10、10年超20年以下の人には20、20年超30年以下の人には30と表示される関数を組みたい ・下記の6列目に2013年3月31日時点における年齢を関数で表示させたい 氏名 入社日付 生年月日  入社年数 区分 年齢 A 1999/4/1 1975/11/9  B 1988/4/1 1962/8/1 C 2007/6/3 D E F G ・ ・ ・ ・ 以上お手数をおかけしますが、宜しくお願いします。

  • 一日(0時0分0秒)おきに表示される文字列を変える

    一日(0時0分0秒)おきに表示される文字列を変えたいのですが、time関数を使って一日(0時0分0秒)の判定がうまくいきません ---以下ソース--- #include <stdio.h> #include <time.h> void *main(void){ time_t timer; struct tm *t_st; int i; char *set[20] ={"お帰り", "帰ってきたな", "どこ行ってたの?プンプン", //---残りは省略します--- }; time(&timer); i=((timer-54000)/86400)%20; //-54000は誤差修正のつもり printf("%s", set[i]); } ---ソースここまで--- 一日(0時0分0秒)の判定がちゃんとされるにはどうしたらいいのでしょうか? localtime関数を使って何日や1月1日から何日経過したかを調べて判定を変えるというのは無しです。 その場合は一ヶ月や一年ごとに初期値に戻されるので。

  • 月数計算

     請求書の作成をエクセルで行おうとしているのですが、請求対象月を各請求書ごとに記載しなければなりません。現状では月が変わるとある一箇所だけ月数を変えてその月から+1したり-1したりしているのですが、年が変わってしまい12月分の請求書を作らなくてはならないのに-1をすると0月分とでてしまいます。12月のときも+1したら13月とでたところを手作業で修正しました。そのようなことがおきないように下記のようなIF関数を書いたのですが、FALSEとでてしまいうまくいきません。 年をこせる関数を現在の月とそこから+-するための数字だけで何月分と簡単にでてくるような数式ってどうやって書けばいいのか教えてください。 =IF(A9<=0,A9+11,IF(0<=$A$9<=12,A9,IF(13<=CZ9,CZ9-12)))

専門家に質問してみよう