• ベストアンサー

PHPとPostgreSQLを使用した労働管理システム

自力では解決出来ず、どうしても解らない事があるので質問させて 頂きたいと思います。ご助言ご助力お願い致します。 題名にもあるように現在PHPとPostgreSQLを使用して労働管理システムを構築しようと考えています。 ・以下がWebのレイアウトとなっています ----------------------------------------------------- 日付(曜日) | 労働時間 | 遅刻時間 | 残業時間| その他 | ----------------------------------------------------- と、このようなレイアウトで労働時間・遅刻時間・残業時間などを 入力する画面を作成したのですが、肝心の曜日の出し方が解りません。 表示させたいのは当月の15日~来月の14日までを曜日含んだ日付です。 ※例えば3月であれば3月15日~4月14日までを曜日を含んだ形で 出力させたいのです。 4月15日になれば4月15日~5月15日が読み込まれるようにしたいです。 このような処理はPHPで可能でしょうか? ご助言よろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • racchoman
  • ベストアンサー率71% (20/28)
回答No.4

現在日が3/1 → 2/15~3/14まで表示 現在日が3/14 → 2/15~3/14まで表示 現在日が3/15 → 3/15~4/14まで表示 ということですよね? 以下でどうでしょうか? <?php $now = time(); $year = (int)date('Y', $now); $month = (int)date('m', $now); $day = (int)date('d', $now); if ($day < 15) $month--; $numOfDays = date('t', mktime(0, 0, 0, $month, 1, $year)); for ($d = 0; $d < $numOfDays; $d++) { echo date("Y-m-d(D)", mktime(0, 0, 0, $month, 15+$d, $year)). "\n"; }

destonias
質問者

お礼

racchoman様、ご返答ありがとうございます。 本当にありがとうございます、この処理で望んでいる事が出来そうです。 しかし『どうして出来るのか?』という肝心なところを自分が理解していないので、今後ゆっくり考えてみます。 他にも多くの方が参考になる考え方を示して頂いているので、もう少し 勉強してみます。

その他の回答 (5)

  • gogo-tea
  • ベストアンサー率75% (25/33)
回答No.6

細かいチェックは別途必要かもしれないですが・・・ <?php $today = mktime (0, 0, 0,date("m"),1,date("Y")); $day = date('d',$today); $year = date('Y',$today); $month = date('m',$today); if($day < 15) $month--; $lastdaytmp = mktime(0, 0, 0, $month+1,0,$year); $lastday = date('d', $lastdaytmp); for($i=0;$i<$lastday;$i++){ $datetmp = mktime(0, 0, 0, $month,($i+15),$year); $dispdatetmp = date('Y-m-d',$datetmp); $w = date('w',$datetmp); switch ($w){ case "0": $strw = "日";break; case "1": $strw = "月";break; case "2": $strw = "火";break; case "3": $strw = "水";break; case "4": $strw = "木";break; case "5": $strw = "金";break; case "6": $strw = "土";break; } $dispdate = $dispdatetmp . " (" . $strw . ")"; echo $dispdate . "<br>"; } ?>

destonias
質問者

お礼

gogo-tea様、このような質問に丁寧なお答えを頂き感謝しております。 質問の質問になってしまうのですが 『細かいチェックは別途必要かもしれないですが…』とありますが 具体的にはどのようなチェックが必要になりますでしょうか? 処理的には多くの方が参考になる意見をくれたお陰で自分の望む処理が 実現出来ました。 gogo-tea様のコードも参考にさせて頂き、曜日の取得が出来るようになりました。 ありがとうございました。(^o^)/

  • sjam
  • ベストアンサー率41% (26/63)
回答No.5

今日の日付(タイムスタンプ)の所得は問題ないですよね。 今日のタイムスタンプに'86400'を足せば明日の日付のタイムスタンプになりますよ。 同様に'86400×日数'をタイムスタンプに足せば、任意の日数後のタイムスタンプになりますから,今日の日付(タイムスタンプ)の所得さえできていれば何日後でも月を超えようが年を超えようが問題なく所得出来ると思います。 但し、1ヶ月後 が28日後なのか30日後なのか31日後なのか、というチェックは必要になりますが、例えば「日が14日になるまで同じ処理を繰り返す」というように処理の終了日を指定すれば問題無しです。 なお、閏秒により秒がずれる恐れがありますので、利用するタイムスタンプを昼12:00の物にする等、閏秒の影響を無視出来るようにするか、閏秒の有無をその都度チェックして計算に入れる処理が必要です。 一応念のため、 $timestamp = mktime(時,分,秒,月,日,年); でタイムスタンプを取り出せますし、 $date_a = getdate(タイムスタンプ); で$date_a['seconds']に秒、$date_a['minutes']に分、以下hours,mday,wday(曜日に対応する数値),mon,year,yday(1月1日からの日数),weekday(曜日の英語),month(月の英語) がそれぞれ取り出せます。

destonias
質問者

お礼

sjam様、度々のご回答申し訳ございません。 >1ヶ月後 が28日後なのか30日後なのか31日後なのか、というチェックは必 >要になりますが、例えば「日が14日になるまで同じ処理を繰り返す」という>ように処理の終了日を指定すれば問題無しです。 これは頭では考えていたのですが、コードに起こすことが出来ませんでした…(>_<) もう少し考えてみて、解らなければ違う方向からもアプローチしたいと 考えています。 度々のご教授感謝しております。

  • golive001
  • ベストアンサー率54% (20/37)
回答No.3

私も初心者なので、勉強がてらに書き込ませてください。 まず、その月の日にちが取得できるということは、checkdate関数を使って 年、月、日が妥当であるかチェックできているということなんでしょう。 こん具合に for($d = 1;$d < 32 ;$d++){ if(checkdate($month,$d,$year)){ print $d."<br/>"; } } ですが、これでは”当月15日から来月14日まで”の条件が満たせません。 従って、(かなり汚いやり方ですが) print $year."年".$month."月"."<br/>"; for($d = 1;$d < 32 ;$d++){ if($d > 14){ if(checkdate($month,$d,$year)){ print $d."<br/>"; } } } print $year."年".($month+1)."月"."<br/>"; for($d = 1;$d <32 ;$d++){ if($d <15){ print $d."<br/>"; } } として、ifで条件を追加してやればいいんじゃないでしょうか? 勤労管理との事ですので、このやり方だと汎用性がないですけどね(^^;

destonias
質問者

お礼

golive001様、ご助言ありがとうございます。 残念ながらcheckdate関数を使用しておりません… 当月の15日~来月の14日までを直接書き込んだ形です。 しかし、これでは本当に望む処理を実現出来ない為、質問させて頂いた 次第です。 このような質問にgolive001様以外にも多くの方が答えてくださっているので皆さんの考えを参考にしたいと考えております。 ご教授ありがとうございました。 私はPHPとPostgreSQLを始めて一ヶ月近くですが、同じ初心者とは、とても 思えないです…(>_<) どのようにすれば、このようなに自分の望む処理をソースに起こせる様に なるのでしょうか…

  • sjam
  • ベストアンサー率41% (26/63)
回答No.2

システムライブラリに依存する様ですが、 strftime( フォーマット , タイムスタンプ ) であれば %a (○) や %A (○曜日) が利用できます。 例えば echo strftime('%y/%m/%d (%a)',タイムスタンプ); で、 yy/mm/dd (曜) 形式の表示になります。

destonias
質問者

お礼

sjam様、ご助言ありがとうございます。 言葉足らずの質問に丁寧に答えてくださり、ありがとうございました。 教えてくださった事は知識として蓄えておきたいと思います。

  • edge8040
  • ベストアンサー率46% (7/15)
回答No.1

http://jp2.php.net/date パラメータ「D」を付ければ曜日取れます。 英文字3文字表記なので、漢字にしたければ内部変換するとか。 パラメータ「w」なら数値で取れますね。 マニュアルが分かり難い場合は http://www.phppro.jp/school/vol18/1 など参考になるかもしれません。 他ページも色々参考になると思います。 頑張ってください。

参考URL:
http://www.phppro.jp/school/vol18/1
destonias
質問者

補足

sjam様、edge8040様 早速のお返事ありがとうございます。 私の言葉足らず・説明不足で申し訳ございませんが 『曜日の出し方が解りません』だけではなく『当月の15日~来月の14日までを曜日含んだ日付の出し方が解りません』という事です… 自力では一ヶ月(4月1日~4月30日)を表示させる事は出来るのですが、それが月を超えるという処理で躓いています。 ※例えば3月であれば3月15日~4月14日までを曜日を含んだ形で出力させたいのです。 4月15日になれば4月15日~5月15日が表示されるようにしたいです。 この処理がPHPでどのようにすればよいか検討がつかない為、ご助言・ご助力お願いします。