
Perlで日付を取得する
perlで1週間分の日付を取得し、セレクトボックスに格納したいと思っています。
なるべくいま使っているサブルーチンを使いたいです。
# 現在日時を文字列化する
sub get_date_string {
# local(@week) = ("日", "月", "火", "水", "木", "金", "土");
local(@week) = ("Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat");
local($sec, $min, $hour, $day, $mon, $year, $weekday) = localtime(time);
$year += 1900;
$mon++;
# 文字列化する
if ($hour < 10) {
$hour = "0$hour";
}
if ($min < 10) {
$min = "0$min";
}
if ($sec < 10) {
$sec = "0$sec";
}
$weekstr = $week[$weekday];
return "$year-$mon-$day ($weekstr) $hour:$min";
# return "$year年$mon月$day日 ($weekstr) $hour時$min分$sec秒";
}
これを別のルーチンで、
$today = substr(&get_date_string,0,10);
$kinou = $today - 1;
$ototoi = $today - 2;
として、今日の日付だけでなく、昨日、おととい、その前の日を取得したいと試みましたが、今日は取得できても、$kinouや$ototoiは、すごい数字になってしまいます。
変わりに -24*3600と引いてみましたがダメでした。
文字列に変更されていないから引けないのでしょうか?
かんたんに処理できそうでできないので、詳しいやり方を教えてください。
No.4ベストアンサー
- 回答日時:
書式付の日付は、strftimeを使うと便利です。
既存のget_date_string関数を変えたくないとのことなので、過去の日付を得る新たな関数get_past_dateというのを作ってみました。
でも、無駄が多いので、極力エポック秒を操作することを考えたほうがいいと思います。参考程度に見てください。
use POSIX 'strftime';
use Date::Calc 'Add_Delta_Days';
sub get_date_string {
return strftime("%Y-%m-%d (%a) %H:%M", localtime);
}
sub get_past_date {
my ($today, $offset_days) = @_;
my ($past_year, $past_month, $past_day) = Add_Delta_Days(split(/-/, $today), $offset_days);
return sprintf("%4d-%02d-%02d", $past_year, $past_month, $past_day);
}
my $today = substr(&get_date_string,0,10);
my $kinou = get_past_date($today, -1);
my $ototoi = get_past_date($today, -2);
print "today=$today\n";
print "kinou=$kinou\n";
print "ototoi=$ototoi\n";
No.5
- 回答日時:
sub get_date_string {
my $now=shift||time; # 追加
# local(@week) = ("日", "月", "火", "水", "木", "金", "土");
local(@week) = ("Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat");
local($sec, $min, $hour, $day, $mon, $year, $weekday) = localtime($now); # timeのところを変更
# 後略
}
使い方
$today = substr(&get_date_string(time),0,10); # 今日の日付
$kinou = substr(&get_date_string(time-24*3600),0,10); # 昨日の日付
$ototoi = substr(&get_date_string(time-2*24*3600),0,10); # 一昨日の日付
未検証です。
todayはtime-(0*24*3600)
kinouはtime-(1*24*3600)
ototoiはtime-(2*24*3600)
のように順番になってるので、ループにするとかのアレンジも出来ると思います。
No.3
- 回答日時:
localtime の引数に使っている関数「time」は、「エポック秒」と呼ばれる「1971年1月1日0時0分を基準とした秒」単位で現在の時刻を返す関数です。
そのエポック秒から年月日時分秒に変換するのがlocaltime関数。
ですので、現在の時刻から24*60*60とか2*24*60*60を引いた数値をlocaltimeの引数にすれば、昨日や一昨日の日時を得ることができます。
あとは、$hour や $min の処理が泥臭いので、sprintfでもっとシンプルに書いてみました。
回答2のようにget_date_stringの引数を現在時からのずらす日数にした方が呼び出しは簡単になりますが、
そうすると、get_date_stringの呼び出しのたびに毎回現在時刻を取得するので、処理に時間がかかったときに、表示時刻がずれていく、という問題があります。
できれば、現在時刻の取得は一回だけにしておいたほうがいいと思います。
---ここから---
use strict;
use warnings;
# 指定日時を文字列化する
sub get_date_string {
my($time) = $_[0] || time;
my(@week) = ("Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat");
#my(@week) = ("日", "月", "火", "水", "木", "金", "土");
my($sec, $min, $hour, $day, $mon, $year, $weekday) = localtime($time);
return sprintf("%4d-%02d-%02d (%s) %02d:%02d", $year+1900, $mon+1, $day, $week[$weekday], $hour, $min);
#return sprintf("%4d年%02d月%02d日 (%s) %02d時%02d分%02d秒", $year+1900, $mon+1, $day, $week[$weekday], $hour, $min, $sec);
}
my $time = time; #現在時刻を取得
my $today = get_date_string($time); #現在の日時
my $kinou = get_date_string($time - 1 * 24 * 60 * 60); #1*24*60*60秒=1日前の日時
my $ototoi = get_date_string($time - 2 * 24 * 60 * 60); #2*24*60*60秒=2日前の日時
print "today=$today\n";
print "kinou=$kinou\n";
print "ototoi=$ototoi\n";
---ここまで---
No.2
- 回答日時:
こんな感じでいかがでしょうか?
2010-9-20 (Mon) 17:24
2010-9-19 (Sun) 17:24
2010-9-18 (Sat) 17:24
と表示されてます。
use strict;
use warnings;
my $today = &get_date_string(0);
my $kinou = get_date_string(-1);
my $ototoi = get_date_string(-2);
print $today, "\n";
print $kinou, "\n";
print $ototoi, "\n";
sub get_date_string {
my ($change_day) = @_; #日付修正
# local(@week) = ("日", "月", "火", "水", "木", "金", "土");
my (@week) =
( "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" ); #myにしました
my ( $sec, $min, $hour, $day, $mon, $year, $weekday ) =
localtime( time + $change_day * 24 * 3600 ); #日付修正
$year += 1900; #myにしました
$mon++;
# 文字列化する
if ( $hour < 10 ) {
$hour = "0$hour";
}
if ( $min < 10 ) {
$min = "0$min";
}
if ( $sec < 10 ) {
$sec = "0$sec";
}
my $weekstr = $week[$weekday]; #my にしました
return "$year-$mon-$day ($weekstr) $hour:$min";
# return "$year年$mon月$day日 ($weekstr) $hour時$min分$sec秒";
}
No.1
- 回答日時:
はっきり言って「このルーチンを使って何とかしよう」というのは間違いだ. time の返り値に対して操作することを考えるべき.
しかし, なんというか涙ぐましい (けど無駄な) 努力だなぁ.... sprintf を覚えよう.
あ, あとこの文脈で local は古臭いので, できれば my を使った方がいいと思うよ.
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- CGI perlで書いたcgiでsqliteの使い方を教えてください 2 2023/05/08 21:29
- その他(プログラミング・Web制作) python 気象データの取得 2 2023/06/20 23:54
- Visual Basic(VBA) 今日の日付が過ぎたらその行を削除したい 1 2023/04/01 20:06
- PHP PHPの構文で間違えが分からない 5 2022/07/11 16:38
- Visual Basic(VBA) 【VBA】先月分の取得ができない理由が分かりません。 2 2022/04/24 11:16
- Visual Basic(VBA) ①ExcelVBAでカレンダーを作り、別のユザーフォームで日付を入力したいのですがエラーになります。 1 2023/02/17 18:39
- PHP SQLとPHPの連結方法がわからないのでアドバイスお願い致します 1 2022/07/12 12:16
- JavaScript ソースコードのいじる場所が分かりません。 1 2022/12/23 02:06
- JavaScript 1日1回引けるJavaScriptおみくじについて 1 2022/12/12 22:28
- 英語 "this day"が当日か今日を表すのかの使い分け方等について 5 2023/08/08 14:29
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・「それ、メッセージ花火でわざわざ伝えること?」
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・【お題】甲子園での思い出の残し方
- ・【お題】動物のキャッチフレーズ
- ・人生で一番思い出に残ってる靴
- ・これ何て呼びますか Part2
- ・スタッフと宿泊客が全員斜め上を行くホテルのレビュー
- ・あなたが好きな本屋さんを教えてください
- ・かっこよく答えてください!!
- ・一回も披露したことのない豆知識
- ・ショボ短歌会
- ・いちばん失敗した人決定戦
- ・性格悪い人が優勝
- ・最速怪談選手権
- ・限定しりとり
- ・性格いい人が優勝
- ・これ何て呼びますか
- ・チョコミントアイス
- ・単二電池
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・ゴリラ向け動画サイト「ウホウホ動画」にありがちなこと
- ・泣きながら食べたご飯の思い出
- ・一番好きなみそ汁の具材は?
- ・人生で一番お金がなかったとき
- ・カラオケの鉄板ソング
- ・自分用のお土産
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ファイル操作
-
C言語のプログラミングについて...
-
JSONで文字列が長い時
-
Application.ScreenUpdating = ...
-
formで特定のinputを送信しない...
-
フォームの内容を確認画面で表示
-
select optionのことで聞きたい...
-
C# GetFilesで複数のファイルの...
-
VBAでPDFのコピーとリネームを...
-
セレクトメニューで2つの項目...
-
map(STL)でinsertを行いたいで...
-
optionのselectedは更新時は効...
-
実行中の変数の中身をイミディ...
-
Perl CGIの中で # を使ってコメ...
-
プロトタイプ宣言のワーニング...
-
sendmailで複数の宛先にメール...
-
コンボボックスのtag情報の取得...
-
perl:ループのカウンタ変数の値...
-
1文字を複数の文字に変換したい...
-
[python] 文字列を変数名として...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
日付の差分の求め方(日、分)
-
前日の日付取得するには?
-
1桁の日付に0を付ける
-
日齢計算プログラム
-
「型が一致しません」のエラー...
-
Perlで日付を取得する
-
Cookieの有効期限について
-
Perlの日付の比較に関して
-
CSV読み込み時に条件に合う行(...
-
年月日の数値化?
-
日付の比較について
-
質問
-
月見る月はこの月の月
-
このソースがコンパイルエラー...
-
CGI:Cookie保存期限の指定について
-
perlでcheckboxがうまく整理で...
-
JSONで文字列が長い時
-
Application.ScreenUpdating = ...
-
16進の10進変換について
-
<SELECT>タグの折り返し
おすすめ情報