วันจันทร์ที่ 6 เมษายน พ.ศ. 2552

Date & Time in PHP


ฟังก์ชั่น Date() ถูกใช้จัดรูปแบบเวลา หรือวันที่ จากค่า Timestamp ซึ่มี syntax ดังนี้
date(format,timestamp)
format คือ การระบุรูปแบบจาก timestamp เพื่อแสดงข้อมูลออกมา
timestamp คือ ค่าตัวเลขของจำนวนวินาที เริ่มตั้งแต่วันที่ 1 มกราคม ค.ศ. 1970 เวลา 00:00:00 น. ถ้าไม่ระบุจะเป็นค่าเวลาปัจจุบัน
รูปแบบของ Date()ค่าแรกของฟังก์ชั่น date() มีรูปแบบต่างๆ มากมาย เราจะแสดงให้ดูตัวอย่างบางตัว:
d คือ แสดงวันของเเดือน มีค่า 01-31
m คือ แสดงเดือน มีค่า 01-12
Y คือ แสดงปี มีค่าเป็น ค.ศ. 4 หลัก
ค่าในรูปแบบต่างๆ สามารถดูได้จาก php date functionส่วนตัวอักขระ เช่น "/" , "." , "-" สามารถจะเพิ่มเข้าไประหว่างตัวอักษรของรูปแบบเวลาได้

ค่าที่ได้จะเป็น
2006/07/11
2006.07.11
2006-07-11
การสร้าง timestampการสร้าง timestamp เป็นเวลาปัจจุบันจะใช้ฟังก์ชั่น time() จะได้ค่าตัวเลข 10 หลักแบบนี้ 1239027959 ซึ่งถ้าเราไม่ใส่ค่า timestamp จะได้ค่าเดียวกันกับ time()ค่า timestamp เป็นค่าที่จะใส่หรือไม่ก็ได้ในฟังก์ชั่น date() ถ้าไม่ใส่จะเป็นเวลาปัจจุบัน แต่ถ้าเราต้องการระบุเวลาที่แน่นอนล่ะ จะต้องใช้ฟังก์ชั่น mktime() โดยมี syntax ดังนี้:
mktime(hour,minute,second,month,day,year)
ตัวอย่างถ้าเราต้องการให้แสดงวันที่ อีก 2 วันข้างหน้าจะเขียนดังนี้

ค่าที่ได้จะเป็น
วันอีก 2 วันข้างหน้า คือ 08/04/2009

ขอบคุณข้อมูลดีดีจาก http://www.phpstreet.com/tutorials/php/php_date.php


การสร้าง DateTime object$dt = new DateTime("2008-08-01 18:10");
สามารถสร้างโดยกำหนด string ของ datetime ตอน construct มันได้เลย ซึ่งมันจะใช้ timezone แบบเดียวกับค่าปริยายของเซิร์ฟเวอร์ เช่น ถ้าเซิร์ฟเวอร์ตั้งอยู่ประเทศไทย ก็จะใช้ timezone เป็น ICT หรือ GMT+0700 หรือถ้าต้องการระบุ timezone เป็นที่อื่น ก็สั่งแบบนี้
$dt1 = new DateTime("2008-08-01 18:10 UTC");
$dt2 = new DateTime("2008-08-05 13:00+09:00");ถ้าไม่ระบุค่า string จะได้ค่าวันที่และเวลาปัจจุบัน สมมติ $d คือ

เวลาเป็น unix timestamp ได้จากฐานข้อมูล ถ้าจะตั้งเวลาให้กับ DateTime ก็ทำได้โดย
$dt3 = new DateTime(strftime("%D %T",$d));
การแปลงเป็น stringเวลาจะเอาไปใช้งาน ก็ต้องแปลงเป็น string ก่อน เช่น เอาไปแสดงผล หรือแปลงไปเป็น unix timestamp เพื่อเอาไปเก็บลง
ฐานข้อมูล หรืออื่นๆ ต่อไป โดย format string ที่ใช้ สามารถดูได้ที่ http://php.net/date

echo $dt->format("l dS of F Y H:i:s")."\n";
$d = $dt->format("U");
echo strftime("%c",$d)."\n";
การตั้งค่า timezoneต้องใช้ TimeZone object ซึ่งใช้แบบง่ายๆ ดังนี้
echo $dt->format("l dS of F Y H:i:s")."\n";
$d = $dt->format("U");
echo strftime("%c",$d)."\n";โดยชื่อ timezone สามารถดูได้จาก http://php.net/timezones ทีนี้เวลาพิมพ์ค่าวันที่ออกมาโดยใช้ method format() ก็จะได้วันเวลาตาม timezone ที่ตั้งไว้
การเปลี่ยนค่าวันที่/เวลา
$dt->setDate(2006,12,31);เปลี่ยนวันที่เป็น 2006-12-31 เวลาคงเดิม
$dt->setTime(12,30,00);เปลี่ยนเวลาเป็น 12:30 โดยวันที่เป็นวันเดิม
$dt->modify("+1 week 2 days 4 hours 2 seconds");เปลี่ยนวันเวลาโดยอ้างอิงกับค่าเดิม ซึ่งรูปแบบ string ให้ใช้แบบเดียวกับ

ฟังก์ชัน strtotime()
การหาผลต่างของวันและเวลาก็คล้ายกับที่คุณ roteee ได้เขียนไว้ โดยต้องแปลงเป็นวินาที (unix time stamp) ก่อน แล้วเอามาลบกัน แล้วหารออกมาเป็นวัน-ชั่วโมง-นาที-วินาที
$dt1 = new DateTime("2007-08-01 18:00:00");
$dt2 = new DateTime();
$dt = $dt2->format("U") - $dt1->format("U");
$d = (int) ($dt / (24*60*60));
$x = $dt % (24*60*60);
$h = (int) ($x / (60*60));
$x = $x % (60*60);
$m = (int) ($x / 60);
$s = $x % 60;

echo $d." days ".$h." hours ".$m." minutes ".$s." secondsn";
ปัญหาของ DateTime objectปัญหาคือ ตรง format() มันยังไม่สนับสนุนการใช้ locale น่ะสิครับ ทำให้ยังไม่สามารถแสดงวันที่แบบท้องถิ่นของประเทศต่างๆ เช่นประเทศไทยได้ ซึ่งจะต่างจากการใช้ strftime() ที่จะใช้ตาม locale ที่ตั้งใน setlocale() ถ้าทำได้ ก็จะสะดวกขึ้นอีกมาก ตอนนี้ต้องใช้วิธีแปลง DateTime เป็น unix time stamp แล้วใช้ strftime() แปลงเป็น string อีกที ดังตัวอย่างนี้
setlocale(LC_TIME, 'ja_JP');

ปล. เดี่ยวจะอธิบายเรื่อง Object Class อีกอย่างระเอียดนะครับ
date_default_timezone_set('Asia/Tokyo');
$dt = new DateTime();
echo strftime("%c\n",$dt->format('U'));
ผลลัพธ์ 2007年08月09日 00時56分54秒ถ้าภาษาไทยก็ใช้ setlocale(LC_TIME, 'th_TH'); และ date_default_timezone_set('Asia/Bangkok'); จะได้ผลลัพธ์เป็น พ. 8 ส.ค. 2550, 23:00:59

ขอคุณข้อมูลดีดีจาก http://www.phpzealots.com/node/71

ไม่มีความคิดเห็น:

แสดงความคิดเห็น

ท่านสามารถสอบถามปัญหาเกี่ยวกับ php html javascript flash ฯลฯ เกี่ยวกับการทำเว็บได้ครับ ผ่าน coment ได้ครับ ยินดีตอบทุกปัญหา