• ベストアンサー

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

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

  • PHP
  • 回答数6
  • ありがとう数7

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

  • ベストアンサー
  • 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でどのようにすればよいか検討がつかない為、ご助言・ご助力お願いします。

関連するQ&A

  • PHPとPostgreSQLを使用した勤務管理

    こんにちは、みなさん宜しくお願い致します。 現在PHPとPostgreSQLを使用して勤務管理を作成しているのですが またまた躓き自分ではこれ以上解決出来なくなったので、再度こちらにて質問させて頂きます。 ※自分が行おうとしている処理一覧です 下記のようなレアウトのテーブルがあります。 ---------------------------------------- 日付(曜日) | 労働時間 | チェックボックス | 登録ボタン  当月15日    |  翌月15日 ---------------------------------------- となっております。 1:日付表示は教えて頂いた処理で実現する事が出来ました。 <?php $now = time(); $year = date('Y', $now); $month = date('m', $now); $day = 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"; } ?> 2:労働時間を入力し、登録ボタンを押せば日付と労働時間がDataBaseに登録される様にしたい 3:出来るならば登録をチェックボックスが押されている項目だけをDatabaseに登録するようにしたいのです。 しかし自分が試した限りではcheckboxを押した項目だけを取得させDatabase に登録させるという処理が出来ませんでした。 それどころか、労働時間を入力し登録ボタンを押せば労働時間を入力した 日付と労働時間がDataBaseに登録される処理すら出来ない状態です。 ご教授をお願いしたく質問させて頂きました。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • PHPとPostgreSQLを使用した勤怠管理システム

    現在、PHPとPostgreSQLを使用して勤怠管理システムを 作成しているのですが、解らない事があるので質問させて下さい。 この手の事で色々と質問しているのですが、ツギハギだらけでDBにも 負荷をかけてしまうような作りになってしまったので 一から作り直しているところです。 ご教授の程、よろしくお願いします。 1)今月15日から来月14日までの曜日つき日付を取得する 2)労働時間を入力してチェックボックスを押せば、日付と労働時間がDBに登録される 3)チェックを押したとき、DBに該当データがあれば、INSERT。 4)チェックを押したとき、DBに該当データがなければ、UPDATE という処理を行いと思います。 以下に以前のコードを記載します。 $weekday = array("日","月","火","水","木","金","土"); //曜日の配列作成 $now = time(); // UNIXタイムスタンプを取得 $year = date('Y', $now); // 年を指定された書式で書式化する $month = date('m', $now); // 月を指定された書式で書式化する $day = date('d', $now); // 日を指定された書式で書式化する // 現在の日付が15日未満だったら、月をマイナスする if($day < MONTH_HARF){ $month--; } // 指定した月の日数を取得 $numOfDays = date('t', mktime(0, 0, 0, $month, 1, $year)); // 日付が指定した月の日数以下ならば for($d = 0; $d < $numOfDays; $d++){ // $dateに15日から末日+14日までの値をyyyy年mm月dd日の形で代入 $date = date("Y年m月d日", mktime(0, 0, 0, $month, 15+$d, $year)); // $wに0~6までの数字に対応した曜日を代入 $w = date("w", mktime(0, 0, 0, $month, $d+1, $year)); // $ymddateに15日から末日+14日までの値をyyyymmdの形で代入 $ymddate = date("Ymd", mktime(0, 0, 0, $month, 15+$d, $year)); //1行の定義:日付(曜日) $line = $weekday[$w]; // 読み込まれた休日と表示されている日付が同じならば、$wに0を代入(日曜日) if($holiday_plasticOperation == $date){ $w = 0; } switch($w){ case 0: //日曜日の文字色 $style = "color:#C30;"; break; case 6: //土曜日の文字色 $style = "color:#03C;"; break; default: //月~金曜日の文字色 $style = "color:#333;"; } echo "<TD WIDTH=100>$date</TD><TD title='$yy'><span style=.$style.>$line</span></TD>"; echo "<TD><INPUT TYPE='text' NAME='work_time[$ymddate]' VALUE='$work_Time' TABINDEX=1 SIZE='7' STYLE='ime-mode: inactive;'></TD>"; echo "<TD><INPUT TYPE='CHECKBOX' NAME='work_check[]' VALUE='$ymddate' TABINDEX=2></TD>"; } どうか、ご教授の程よろしくお願いします。

    • 締切済み
    • PHP
  • 賃金台帳の書き方(労働時間)

    完全月給制(欠勤・遅刻等のいわゆる勤怠控除はしない)で当月分を当月20日に支給(5月分を5月20日に支給)ということになっています。一方、時間外手当の締切日という意味で給与計算の締切日は毎月15日として、当月20日払いということになります。 平たく言えば 「毎月15日締めの当月20日支給」 ということになるでしょうか。 で、給与明細・賃金台帳には毎月の労働日数、労働時間等の勤怠を記載する必要がありますが、どう書けばいいのか迷っています。 (1)支給月 5月(5月分)  賃金計算期間 4.16~5.15  労働日数   20日(4.16~5.15の実働日数)  労働時間数  160時間  普通残業時間  15時間(4.16~5.15の時間外) という表現なのか 完全月給制なので (2)支給月 5月(5月分)  賃金計算期間 5.1~5.31  労働日数   ????  労働時間   ????時間  普通残業時間 15時間(4.16~5.15の時間外)  完全月給制の当月分を当月20日払うわけで、21日以降月末までが残っていて当月の労働日数・労働時間が確定できないわけですが・・・ うまく表現できていないかもしれませんが、なんとなく質問の趣旨は わかってもらえますでしょうか。 完全月給制の当月給与を当月20日に(ただし残業代の計算は前月16日~当月15日までの計算)払う場合、賃金計算期間、労働日数、労働時間はどう書けばいいのでしょう、ということなんですが・・・ 長々とすみません。よろしくお願いします。

  • 勤怠管理 コアタイムのデータ管理 Java & PostgreSQL

    Java+PostgreSQLを使い、勤怠管理システムを作成中です。 システムではコアタイムを複数設定でき、環境にあわせた勤怠管理が できるようにしたいです。 従業員の勤怠集計はコアタイムを基準に、早出、基本時間、遅刻、残業を 算出できるようにしたいです。 現在、DBスキーマとテーブルに対応するJavaエンティティの定義を進めて いますが、型をどのようにすれば集計が楽になるかわからず困っています。 悩んでいるのが、日付をまたいだコアタイムを設定するとき、PostgreSQLの time型では23:59を超える時刻を扱えないため、 開始 > 終了 という データを登録する必要があり、計算が複雑になることです。 考えているものとしては、2つあります。 1) PostgreSQLの型:time Javaの型:java.sql.Time 2) PostgreSQLの型:integer(分であらわす。9:00であれば、540) Javaの型:Integer(分であらわす。9:00であれば、540) 1)は前述での計算が複雑になる問題があり、2)は、やり方がスマートでは ないような気がします。 どのような定義にすれば妥当でしょうか。 アドバイスや過去の事例等あれば、ご教授下さい。

  • 代出は時間外労働となるか?

    代出は時間外労働となるか? 時間外労働は月40時間までと36協定で締結しています。 そのため、残業が40時間を越えないように管理しています。 弊社は9:00-18:00休憩1時間の勤務時間で、 週5日出勤(土日休み)になっています。 残業を40時間ギリギリ一杯まで行なって、まだやることが ある場合は、土曜や日曜に代出して作業を行います。 代休が当月内に取れれば良いのですが、ほとんど 翌月以降に代休を取ることになります。 この場合、時間外労働は40時間で大丈夫なのか、 40時間プラス当月内に代休が取れなかった日の時間 になっていて、労働基準法違反となっているのか どちらでしょうか?

  • 裁量労働制の労働時間について

    現在、デザインの仕事をしています。 契約では「専門裁量労働制」ということで 基本給+月30時間分の裁量手当て(みなし残業代)が支給されています。 就業規則には ■出社した日は9.5時間働いたとみなす ■遅刻・早退は発生しない ■深夜22時~朝5時までの就業には別途割り増し分を支払う ■休日出勤には別途割り増し分を支払う となっています。 教えていただきたいのは残業代のことです。 私の会社では、年間の全時間数で残業が計算され 年に1回まとめての支給になっているのですが、これは普通のことでしょうか? 例として単純に計算すると 1日8時間(定時分)×20日+30時間(みなし残業)=190時間 ×12ヶ月=2280時間 年間2280時間として、これをオーバーした時間分が残業代として支給されています。 なので、例えば5月に60時間残業(月220時間労働)したとしても 6月の残業がゼロ(定時の160時間労働)だと、残業代支給はゼロになっていまうのですが…。 もちろん、仕事の無いときには早く帰ることができるので そんなに不満と言うわけでは無いのですが、 (もちろん早く帰った分、他の日の残業代が減ります) 「出社した日は9.5時間働いたとみなす」と言う以上、1回の出社ごとに 9.5時間消化したと言えるのではないかと思うのです。 こんな状態なら「1年○○○時間労働で年俸××円」と言う 契約にするべきではないかと思います。 せめて1ヶ月単位での清算にしてもらいたいのですが…。 裁量労働制とはこのようなものなのでしょうか。 ご回答よろしくお願いいたします。

  • 臨時社員の労働契約書

    臨時社員の労働契約で質問です。 契約書には、曜日、その曜日ごとの労働時間が決められてます。 しかし、実際の運用として契約書の時間よりも短い、もしくは長い時間でシフトを組むことは、可能なのでしょうか? また、実労働時間が39時間とありますが、これは残業時間も含めたものでしょうか? よろしくお願いします。

  • postgreSQL+phpでの検索結果表示について

    現在、postgreSQL+phpで簡単なイベント検索機能付きのホームページを作っています。 DB側には、テーブルがひとつだけ。 日付、イベント名、場所などの列があり、場所が複数なため、同じ日付けで別のイベントという情報もあります。 表示したいのは、日付ごとの情報です。 しかも検索は○日~○日という風に数日間に渡って検索します。 つまり、 1月1日 イベント名:その1 場所:会場1 イベント名:その2 場所:会場2 --------- 1月3日 イベント名:その3 場所:会場1 イベント名:その4 場所:会場4 --------- という感じです。 これが上手く行かないんですよね。 「考え方」で結構ですのでご教授頂けないでしょうか?

  • これ、労働基準法違反ですか?

    うちの会社の労働環境なんですが、 いくつか労働基準法を違反していないか、 回答をいただけると幸いです。 (1)遅刻をすると、15分単位で給料から引かれる 例えば1分遅刻すると15分分の給料が引かれ、 16分の遅刻で30分分引かれる。 (2)交通費は全額支給だが、車出勤は禁止のため、車で出社すると、 交通費が日割りで1日分引かれる。 例えば交通費が20000円支給されており、月22日出社の場合、 1回車で出社すると、20000÷22=909で 909円引かれる。 (3)残業代が一律計算。 仕事の性質上、残業が多いのだが(月平均100時間以上)、 どれだけ残業しても、残業代は一律で30,000円。 一回、労働基準監督署の指導が入り、ひと月だけ残業代らしき 支給があった(それ以降は特になし)。 (4)社用車で事故した場合、10万円を給料から天引き。 もちろん社用車は保険に入っているため、修理費はかからない。 保険代は上がりますが。それにしても上がった差額が10万円も するハズはないですし。 以上、長文になりましたが、回答をいただけると助かります。

  • 労働時間の自己管理について

    労働時間の自己管理の必要性について教えて下さい。 今働いている会社は商社で私は営業をしてます。残業代とボーナスがありません。給与体制は年俸制です。社員数は20名ほど。 会社の方針ですが、基本的に営業時間9時から18時(労働時間8時間)で残業しないで定時過ぎたらなるべく早く帰るように、となってます。 営業はほぼ個人がどうやり繰りするかによって忙しさが変わりますので、正直いつも定時で帰るというのは叶わないのですが、残業代が出ないという事と、自分がやらないといけないと思った事がある場合、自主的に残って仕事をしています。 今の現状で月にどの程度働いているか管理をして何か会社に訴えたい訳ではないのですが、彼女に「社会人として働いている人は労働時間の自己管理はすべき事」だと言われました。 会社は残業代を出さないという方針の為、勤怠管理(◯時出社、◯時退社)はしておらず、有給休暇・欠勤などがあった場合は届出をエビデンスとして管理しているようです。 給料は毎月同額が支払われ、残業代が出ない為月々の労働時間を集計する意味は個人的にはないと思ってます。ちなみに現在は残業したとしても週2で20時まで残るようなレベルです。 給料も年俸1,000万です。 その私が労働時間を管理する必要性はあるのでしょうか? また必要性がある場合、なぜかも教えて頂けると幸いです。 長々と失礼いたしました。御回答、お待ちしております。