|
สอนวิธีเขียนฟังก์ชั่นแสดงผลวันที่และเวลาคล้ายๆ facebook |
สอนวิธีเขียนฟังก์ชั่นแสดงผลวันที่และเวลาคล้ายๆ facebook พื้นฐานของการหาค่าเวลาใน PHP (และในภาษาอื่นๆ ด้วย) ส่วนใหญ่จะคิดจาก Unix Timestamp
ซึ่งมีหน่วยเป็นวินาที เริ่มต้นนับจากวันที่ 1 มกราคม 1970 GMT
แต่ก็ไม่ได้หมายความว่าวันที่ 1 มกราคม 1970 จะมีค่า Unix Timestamp เป็น 0 เสมอไป
เพราะขึ้นอยู่กับการตั้งค่า date.timezone ใน php.ini
ซึ่งฟังก์ชั่นที่ให้ค่า Unix Timestamp นั้นมีหลายฟังก์ชั่นด้วยกัน
แต่ที่ใช้กันบ่อยๆ ได้แก่
time() หา Unix Timestamp ของเวลาปัจจุบัน
strtotime() แปลงสตริงให้เป็น Unix Timestamp
ini_set('date.timezone', 'Asia/Bangkok');
echo strtotime('1970-01-01 00:00:00'); // -25200
ini_set('date.timezone', 'GMT');
echo strtotime('1970-01-01 00:00:00'); // 0
ส่วนการนำ Unix Timestamp ไปใช้งานนั้น หลักๆ ก็นำไปใช้กับฟังก์ชั่น date()
ซึ่งจะทำการแปลง Unix Timestamp ให้เป็นข้อมูลเกี่ยวกับเวลา ตามรูปแบบที่เราต้องการ
$now = time();
echo date('d', $now); // แสดงเลขวันที่แบบมี 0 นำหน้า
echo date('j', $now); // แสดงเลขวันที่แบบไม่มี 0 นำหน้า
echo date('m', $now); // แสดงเลขเดือนแบบมี 0 นำหน้า
echo date('M', $now); // แสดงชื่อเดือนภาษาอังกฤษแบบย่อ
echo date('Y', $now); // แสดงเลขปีแบบเต็ม
echo date('Y-m-d', $now); // แสดงวันที่ในรูปแบบ ปี-เดือน-วัน เช่น 2013-04-08
echo date('H', $now); // แสดงชั่วโมงแบบ 24 ชม.แบบมี 0 นำหน้า
echo date('i', $now); // แสดงนาทีแบบมี 0 นำหน้า
echo date('s', $now); // แสดงวินาทีแบบมี 0 นำหน้า
echo date('H:i:s', $now); // แสดงเวลาในรูปแบบ ชั่วโมง:นาที:วินาที เช่น 12:57:02
echo date('Y-m-d H:i:s', $now); // แสดงวันที่ีและเวลาตามที่กล่าวมาข้างต้นในครั้งเดียว
ดังนั้นเมื่อเรารู้จักฟังก์ชั่นพื้นฐานเหล่านี้แล้ว การสร้างฟังก์ชั่นเพื่อคำนวณระยะห่างของเวลาก็จะทำได้ดังนี้
<?php
function str_time_diff($timestamp = null, $html = true, $days_before_full_date = 3)
{
// เราจะหาค่า "ช่วงห่างของเวลาปัจจุบันกับเวลาที่กำหนด"
// โดยเวลาปัจจุบันนั้นหาได้จากฟังก์ชั่น time()
// ซึ่งเวลาที่กำหนดนั้นก็จะอยู่ในตัวแปร $timestamp
// ซึ่งทั้งหมดจะมีหน่วยเป็นวินาที ซึ่งจะเก็บไว้ในตัวแปร $diff
// แต่ก่อนอื่นเราต้องตรวจว่า $timestamp เป็นตัวเลขหรือไม่
if (is_numeric($timestamp)) {
// ถ้าใช่ ก็เอาไปลบกับเวลาปัจจุบันเลย
$diff = time() - $timestamp;
} else {
// ถ้าไม่ ก็อนุมานว่ามันเป็นสตริง เช่น 2013-03-07 07:57:12
// ลองเอาไปแปลงเป็นวินาทีด้วย strtotime() แล้วลบกับเวลาปัจจุบัน
$diff = time() - strtotime($timestamp);
}
// หากความต่างของเวลาปัจจุบันกับ $timestamp เป็น 0
if (!$diff) {
$str = "เมื่อกี้นี้เอง";
}
// หากความต่างของเวลาปัจจุบันกับ $timestamp น้อยกว่า 1 นาที
elseif ($diff < 60) {
$str = "เมื่อ $diff วินาทีที่แล้ว";
}
// หากความต่างของเวลาปัจจุบันกับ $timestamp น้อยกว่า 1 ชั่วโมง
elseif ($diff < 3600) {
$str = 'เมื่อ ' . (int)($diff / 60) . ' นาทีที่แล้ว';
}
// หากความต่างของเวลาปัจจุบันกับ $timestamp น้อยกว่า 1 วัน
elseif ($diff < 86400) {
$str = 'เมื่อ ' . (int)($diff / 3600) . ' ชั่วโมงที่แล้ว';
}
// หากความต่างของเวลาปัจจุบันกับ $timestamp น้อยกว่าจำนวนวันที่กำหนดไว้
// ในตัวแปร $days_before_full_date ที่เราจะใช้เป็นตัวบอกว่า
// ควรจะแสดงวันที่เต็มเมื่อช่วงห่างเกินกี่วัน
elseif ($diff < 86400 * $days_before_full_date) {
$str = 'เมื่อ ' . (int)($diff / 86400) . ' วันที่แล้ว';
}
// หากตัวแปร $html เป็นจริง
// หรือตัวแปร $str ยังไม่ถูกสร้างขึ้น ซึ่งเป็นเพราะช่วงห่างไม่อยู่ในเงื่อนไขข้างต้นเลย
if ($html || !isset($str)) {
// ตัวแปรที่ใช้แสดงผลชื่อเดือนภาษาไทย
static $months = array(
// ให้ index เริ่มที่ 1
1 => 'มกราคม', 'กุมภาพันธ์', 'มีนาคม', 'เมษายน',
'พฤษภาคม', 'มิถุนายน', 'กรกฎาคม', 'สิงหาคม',
'กันยายน', 'ตุลาคม', 'พฤศจิกายน', 'ธันวาคม'
);
// หาค่าส่วนต่างๆ ของวันที่ปัจจุบันที่ต้องการ ด้วย explode() สตริงที่สร้างจาก date()
// สมมติ date('j n Y H:s') สร้างสตริงออกมาแบบนี้ '8 4 2013 04:29'
// เมื่อ explode() สตริงดังกล่าวโดยมี "ช่องว่าง" เป็นตัวแบ่ง
// ก็จะได้ array('8', '4', '2013', '04:29')
// และเพราะ array ดังกล่าวเป็น indexed array
// เราจึงสามารถแยกใส่ตัวแปรได้ด้วย list()
list($day, $month, $year, $time) = explode(' ', date('j n Y H:s'));
// ทำค.ศ.ให้เป็นพ.ศ.ด้วยการ +543
$year += 543;
// วันที่เต็ม ที่จะใช้แสดงแบบเต็ม หรือใช้ใน attribute title
$full_str = "เมื่อวันที่ $day $months[$month] $year เวลา $time น.";
// หาก $str ยังไม่ได้ถูกสร้างขึ้น แสดงว่าเราต้องแสดงวันที่แบบเต็ม
if (!isset($str)) {
// ทำให้ $str มีค่าเดียวกันกับ $full_str
$str = $full_str;
}
}
// คืนค่ากลับไป
return $html
// หากตัวแปร $html เป็นจริง ก็ส่งค่ากลับไปในรูปแบบ HTML
// โดยให้ $str เป็นข้อความอยู่ใน tag <span>
// และให้ $full_str เป็นค่าของ attribute title
? "<span class=\"str-time-diff\" title=\"$full_str\">$str</span>"
// แต่ถ้าไม่ ก็ส่งค่าของ $str กลับไปเฉยๆ
: $str;
}
ฟังก์ชั่นที่ปรากฏในบทความนี้ (5)- date() - Format a local time/date
- explode() - Split a string by string
- is_numeric() - Finds whether a variable is a number or a numeric string
- strtotime() - Parse about any English textual datetime description into a Unix timestamp
- time() - Return current Unix timestamp
|
|
|
|
|
|
|
|
By : |
phpinfo()
|
|
Article : |
บทความเป็นการเขียนโดยสมาชิก หากมีปัญหาเรื่องลิขสิทธิ์ กรุณาแจ้งให้ทาง webmaster ทราบด้วยครับ |
|
Score Rating : |
|
|
Create Date : |
2013-04-08 |
|
Download : |
No files |
|
Sponsored Links |
|
|
|
|
|
|