|
|
|
[ทำได้แล้วครับ] การคำนวณจำนวนวันลา รบกวนช่วยดูให้หน่อยครับ ผมพลาดตรงไหนไป |
|
|
|
|
|
|
|
ผมทำ function ขึ้นมาเพื่อคำนวณวันลาของพนักงาน โดยมีเงื่อนไขคือ
1.เข้างาน 09.00 พักกินข้าว 12.00-13.00 เลิกงาน 18.00 = ทำงาน 8 ชั่วโมง หักพักเที่ยงออก 1 ชั่วโมง
2.ลาได้ขั้นต่ำ 1 ชั่วโมงขึ้นไป = 0.125 (1 วัน = 0.125 x 8)
3.ถ้าช่วงที่ลาเริ่มที่ก่อน 12.00 และสิ้นสุดที่่หลัง 13.00 จะหักพักเที่ยง 1 ชั่วโมง เ่ช่น ลา 10.00 - 14.00 = ลา 3 ชั่วโมง
ปัญหาที่เจอก็คือ ผมลองตั้งวันที่เริ่มต้น = 2011-03-27 09:00:00 และวันที่่สิ้นสุด = 2011-03-28 18:00:00
จะได้คำตอบออกมา = 1.95833333333 ทั้งที่ความจริงมันไม่น่าจะมีเศษทศนิยมออกมา แต่ถ้าตั้งเป็นวันอื่นกลับไม่เจอปัญหานี้
เช่น วันที่เริ่มต้น = 2011-03-25 09:00:00 และวันที่่สิ้นสุด = 2011-03-27 18:00:00 จะได้คำตอบเป็น 3 ถ้วน ๆ ครับ
calc_leave.php
<?
function calc_leave($leave_start,$leave_end)
{
$y_start=date("Y",strtotime($leave_start));
$m_start=date("m",strtotime($leave_start));
$d_start=date("d",strtotime($leave_start));
$y_end=date("Y",strtotime($leave_end));
$m_end=date("m",strtotime($leave_end));
$d_end=date("d",strtotime($leave_end));
$date_total=((strtotime($y_end."-".$m_end."-".$d_end) - strtotime($y_start."-".$m_start."-".$d_start))/(60*60*24));
$h_start=date("H",strtotime($leave_start));
$h_end=date("H",strtotime($leave_end));
$h_total=$h_end-$h_start;
if(($h_start==9)&&($h_end==18))
{
$h_total=1;
}
elseif(($h_start<12)&&($h_end>12))
{
$h_total--;
$h_total=($h_total*0.125);
}
elseif($h_total<0)
{
$date_total--;
$h_start=18-$h_start;
$h_end=$h_end-9;
$h_total=($h_end+$h_start)*0.125;
}
elseif($h_total>0)
{
$h_total=($h_total*0.125);
}
return $date_total+$h_total;
}
?>
index.php
<?error_reporting(1);?>
<?
include("calc_leave.php");
$leave_start="2011-03-27 09:00:00";
$leave_end="2011-03-28 18:00:00";
echo calc_leave($leave_start,$leave_end);
?>
Tag : PHP
|
ประวัติการแก้ไข 2011-04-28 10:05:27
|
|
|
|
|
Date :
2011-04-27 16:59:00 |
By :
NarinNil |
View :
4685 |
Reply :
3 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ขอบคุณครับ จะลองศึกษาดูก่อน
|
|
|
|
|
Date :
2011-04-27 22:41:19 |
By :
NarinNil |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ได้คำตอบแล้วครับ code ผมไม่ได้ผิด แต่ผิดตรงการตั้งค่าที่ตัว web server
คือเราต้องไปตั้งค่าใน php.ini ให้เป็น date.timezone = "Asia/Bangkok"
แล้ว restart apache หรือ iis ของท่านรอบนึงก็ใช้ได้ (ผมใช้ appserv 2.6.0)
ทดสอบ code แล้วใช้ได้ปกติ เฮ้อ นั่งงมตั้งนานว่าผมพลาดอะไรไป พลาดที่การ
ตั้งค่า่บน server นี่เอง
สาเหตุเพราะผมลองเอาโค้ดตามลิงค์ที่ mr.win แนะนำมารัน โดยเริ่มต้นที่ 27/03/2011
สิ้นสุด 28/03/2011 เอา 2 อันนี้มาลบกัน ควรจะได้คำตอบ = 24 ชั่วโมง หรือ 1 วัน
แต่ก็ยังได้คำตอบออกมาเป็น 23 ชั่วโมง สุดท้ายเอาวันที่เจ้าปัญหา 28/03/2011
ไปหาใน google ก็พบว่า ทางยุโรเขาปรับเวลาต้อนรับฤดูใบไม้ผลิให้เร็วขึ้น 1 ชั่วโมง
ดังนั้นเท่ากับว่าวันที่ 28/03/2011 = 23 ชั่วโมงก็ถูกตามมาตรฐานสากลแล้ว เพราะเขาเคย
เพิ่มเวลาไป 1 ชั่วโมงแล้วตอนเข้าหน้าหนาว (วันที่ 31/10/2011 มี 25 ชั่วโมงครับ) แต่เราคนไทยอยู่ที่
GMT+7 ไม่ต้องไปยุ่งกับเขา เวลาเราเดิน 1 วัน = 24 ชั่วโมงตลอด แต่ apache เดิม ๆ มันมาจากฝรั่งทำ
เลยทำเวลามาตรฐานที่ติดมาเป็นแบบฝรั่ง เราเลยต้องปรับมาเป็นแบบไทย ๆ ครับ ตามที่แจ้งไปแล้ว
|
ประวัติการแก้ไข 2011-04-28 09:47:50 2011-04-28 09:49:48
|
|
|
|
Date :
2011-04-28 09:47:12 |
By :
NarinNil |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Load balance : Server 02
|