มีฟังก์ชั่น PHP ที่คืนค่าวันที่และเวลาในรูปแบบเดียวกันกับฟังก์ชั่น MySQL NOW()
หรือไม่?
ฉันรู้วิธีการใช้date()
งาน แต่ฉันถามว่ามีฟังก์ชั่นเฉพาะสำหรับสิ่งนี้หรือไม่
ตัวอย่างเช่นเมื่อต้องการส่งคืน:
2009-12-01 00:00:00
มีฟังก์ชั่น PHP ที่คืนค่าวันที่และเวลาในรูปแบบเดียวกันกับฟังก์ชั่น MySQL NOW()
หรือไม่?
ฉันรู้วิธีการใช้date()
งาน แต่ฉันถามว่ามีฟังก์ชั่นเฉพาะสำหรับสิ่งนี้หรือไม่
ตัวอย่างเช่นเมื่อต้องการส่งคืน:
2009-12-01 00:00:00
คำตอบ:
ไม่ได้นอกเหนือจากฟังก์ชั่นวันที่ :
date("Y-m-d H:i:s");
date_default_timezone_set
ฟังก์ชั่น
date('Y-m-d H:i:s')
ดูที่นี่สำหรับรายละเอียดเพิ่มเติม: http://pl.php.net/manual/en/function.date.php
ด้วยเวอร์ชัน PHP> = 5.4 DateTimeสามารถทำได้: -
echo (new \DateTime())->format('Y-m-d H:i:s');
ใช้ฟังก์ชั่นนี้:
function getDatetimeNow() {
$tz_object = new DateTimeZone('Brazil/East');
//date_default_timezone_set('Brazil/East');
$datetime = new DateTime();
$datetime->setTimezone($tz_object);
return $datetime->format('Y\-m\-d\ h:i:s');
}
ลองสิ่งนี้:
date("Y-m-d H:i:s");
คำตอบสั้น ๆ
$now = date_create()->format('Y-m-d H:i:s');
อ่านด้านล่างสำหรับคำตอบที่ยาว
ล้อเลียนของฟังก์ชัน MySQL NOW () ใน PHP
นี่คือรายการวิธีใน PHP ที่เลียนแบบNOW()
ฟังก์ชันMySQL
// relative date
$now = date_create('now')->format('Y-m-d H:i:s'); // works in php 5.2 and higher
$now = date_create()->format('Y-m-d H:i:s'); // also works in php 5.2
$now = new DateTime('now')->format('Y-m-d H:i:s'); // syntax error!!!
$now = (new DateTime('now'))->format('Y-m-d H:i:s'); // works in php 5.4 and higher
$now = date('Y-m-d H:i:s'); // Slightly higher performance, but less usable for date/time manipulations
// From Unix timestamp
// Using date_create() with a Unix timestamp will give you a FALSE,
// and if you try to invoke format() on a FALSE then you'll get a:
// Fatal error: Call to a member function format() on boolean
// So if you work with Unix timestamps then you could use: date_create_from_format().
$unixTimeStamp = 1420070400; // 01/01/2015 00:00:00
$y2015 = date_create_from_format('U', $unixTimeStamp, timezone_open('Europe/Amsterdam'))->format('Y-m-d H:i:s');
$y2015 = date('Y-m-d H:i:s', $unixTimeStamp);
ฉันคิดว่าdate_create()->format('Y-m-d H:i:s')
เป็นวิธีที่ดีที่สุดเพราะวิธีนี้ช่วยให้คุณสามารถจัดการกับเวลา / เขตเวลาได้ง่ายกว่าdate('Y-m-d H:i:s')
และใช้งานได้ตั้งแต่ php 5.2
ฟังก์ชั่น MySQL NOW()
ให้ค่า dateTime 'YYYY-MM-DD HH:MM:SS'
ในรูปแบบนี้: ดูที่นี่: https://dev.mysql.com/doc/refman/8.0/en/date-and-time-functions.html#function_now https://dev.mysql.com/doc/refman/8.0/en/date-and-time-functions.html#function_now
ข้อเท็จจริงที่น่าสนใจคือมีความเป็นไปได้ที่จะได้รับรูปแบบวันที่และเวลาโดยเรียกใช้แบบสอบถามนี้: SHOW VARIABLES LIKE 'd%e_format'
ผลลัพธ์อาจเป็นดังนี้:
Variable_name Value
date_format %Y-%m-%d
datetime_format %Y-%m-%d %H:%i:%s
ตัวแปรข้างบนนี้เป็นตัวแปรแบบอ่านอย่างเดียว ดังนั้นคุณไม่สามารถเปลี่ยนได้
ฉันเดาว่าNOW()
ฟังก์ชั่นMySQL รับรูปแบบจากdatetime_format
ตัวแปร
ข้อดีของ date_create () -> format () แทน date ()
ข้อเท็จจริงที่เป็นที่นิยมdate_create('now')->format('Y-m-d H:i:s')
มากกว่าdate('Y-m-d H:i:s')
คือ:
ข้อเสียของ date_create () -> format () แทน date ()
ฟังก์ชั่นที่มีประสิทธิภาพที่ดีขึ้นกว่าเล็กน้อยdate()
date_create()->format()
ดูการทดสอบเกณฑ์มาตรฐานด้านล่าง
$start = time();
for ($i = 0; $i <= 5000000; $i++) {
$a = date_create('now')->format('Y-m-d H:i:s');
}
$end = time();
$elapsedTimeA = $end - $start;
echo 'Case A, elapsed time in seconds: ' . $elapsedTimeA;
echo '<br>';
$start = time();
for ($i = 0; $i <= 5000000; $i++) {
$b = date('Y-m-d H:i:s');
}
$end = time();
$elapsedTimeB = $end - $start;
echo 'Case B, elapsed time in seconds: ' . $elapsedTimeB;
echo '<br>';
// OUTPUT
Case A, elapsed time in seconds: 31
Case B, elapsed time in seconds: 14
ตัวพิมพ์ใหญ่แสดงว่าdate()
เร็วขึ้น อย่างไรก็ตามหากเราเปลี่ยนสถานการณ์การทดสอบเล็กน้อยผลลัพธ์จะแตกต่างกัน ดูด้านล่าง:
$start = time();
$dt = date_create('now');
for ($i = 0; $i <= 5000000; $i++) {
$a = $dt->format('Y-m-d H:i:s');
}
$end = time();
$elapsedTimeA = $end - $start;
echo 'Case A, elapsed time in seconds: ' . $elapsedTimeA;
echo '<br>';
$start = time();
for ($i = 0; $i <= 5000000; $i++) {
$b = date('Y-m-d H:i:s');
}
$end = time();
$elapsedTimeB = $end - $start;
echo 'Case B, elapsed time in seconds: ' . $elapsedTimeB;
echo '<br>';
// OUTPUT
Case A, elapsed time in seconds: 14
Case B, elapsed time in seconds: 15
วิธี DateTime: เร็วกว่าที่นี่format()
date()
ข้อดีของ date_create () -> format () แทน date () โดยละเอียด
อ่านต่อไปสำหรับคำอธิบายโดยละเอียด
จัดการกับเวลาได้ง่ายขึ้น
date_create()
ยอมรับรูปแบบวันที่ญาติที่ / เวลา (เช่นnow
, yesterday
หรือ+1 day
) ดูที่ลิงค์นี้ตัวอย่าง:
$tomorrow = date_create('+1 day')->format('Y-m-d H:i:s');
date()
ยอมรับรูปแบบวันที่ / เวลาแบบสัมพัทธ์เช่นกัน:
$tomorrow = date('Y-m-d H:i:s', strtotime('+1 day'));
$tomorrow = date('Y-m-d H:i:s', (time() + 86400)); // 86400 seconds = 1 day
จัดการเขตเวลาได้ง่ายขึ้น
เมื่อเขตเวลาสำคัญการใช้งานdate_create()->format()
จะสมเหตุสมผลมากกว่าdate()
เนื่องจากdate()
ใช้เขตเวลาเริ่มต้นซึ่งกำหนดค่าไว้php.ini
ที่date.timezone
คำสั่ง ลิงก์: http://php.net/manual/en/datetime.configuration.php#ini.date.timezone http://php.net/manual/en/datetime.configuration.php#ini.date.timezone
มันเป็นไปได้ที่จะเปลี่ยนเขตเวลาในช่วงเวลาทำงาน ตัวอย่าง:
date_default_timezone_set('Asia/Tokyo');
.
ข้อเสียของมันคือมันจะส่งผลกระทบต่อฟังก์ชั่นวันที่ / เวลาทั้งหมด ปัญหานี้ไม่ได้มีอยู่ถ้าคุณกำลังใช้ร่วมกับdate_create()->format()
timezone_open()
PHP สนับสนุนเขตเวลาที่สำคัญ สิ่งที่ตลกคือมันยังรองรับวงกลมอาร์กติกและแอนตาร์กติกา คุณเคยได้ยินเกี่ยวกับLongyearbyen
? ถ้าไม่เช่นนั้นไม่ต้องกังวลฉันก็ไม่ได้จนกว่าฉันจะอ่านเอกสาร PHP อย่างเป็นทางการ
$nowLongyearbyen = date_create('now', timezone_open('Arctic/Longyearbyen'))->format('Y-m-d H:i:s');
ดูรายการเขตเวลาที่รองรับทั้งหมด: http://php.net/manual/en/timezones.php http://php.net/manual/en/timezones.php
OOP
OOP ใช้ออบเจกต์แบบเต็มสถานะ ดังนั้นฉันชอบคิดแบบนี้:
// Create a DateTime Object.
// Use the DateTime that applies for tomorrow.
// Give me the datetime in format 'Y-m-d H:i:s'
$tomorrow = date_create('+1 day')->format('Y-m-d H:i:s');
จากนั้นให้คิดแบบนี้
// Give me a date time string in format 'Y-m-d H:i:s',
// use strtotime() to calculate the Unix timestamp that applies for tomorrow.
$tomorrow = date('Y-m-d H:i:s', strtotime('+1 day'));
ดังนั้นผมจะบอกว่าวิธีการที่สามารถอ่านได้มากขึ้นกับผมแล้วdate_create()->format()
date()
date_create () VS DateTime ใหม่ ()
ข้อเท็จจริงที่เป็นที่นิยมdate_create()
มากกว่าnew DateTime()
คือ:
namespaces
หากคุณทำงานในเนมสเปซและต้องการกำหนดค่าเริ่มต้นวัตถุ DateTime ด้วยคำหลักใหม่คุณต้องทำดังนี้:
namespace my_namespace;
// The backslash must be used if you are in a namespace.
// Forgetting about the backslash results in a fatal error.
$dt = new \DateTime();
ไม่มีอะไรผิดปกติกับสิ่งนี้ แต่ข้อเสียของข้างต้นคือผู้คนลืมระยะแบ็กสแลชเป็นระยะ เมื่อใช้date_create()
ฟังก์ชัน Constructor คุณไม่ต้องกังวลเกี่ยวกับเนมสเปซ
$dt = date_create(); // in or not in a namespace it works in both situations
ตัวอย่างของ date_create () -> format ()
ฉันใช้วิธีนี้สำหรับโครงการของฉันหากฉันต้องกรอกข้อมูลในอาร์เรย์ แบบนี้:
$array = array(
'name' => 'John',
'date_time' => date_create('now')->format('Y-m-d H:i:s'), // uses the default timezone
'date_time_japan' => date_create('now', timezone_open('Asia/Tokyo'))->format('Y-m-d H:i:s'),
);
ฉันกำลังมองหาคำตอบเดียวกันและฉันได้พบกับโซลูชันนี้สำหรับPHP 5.3 หรือใหม่กว่า:
$dtz = new DateTimeZone("Europe/Madrid"); //Your timezone
$now = new DateTime(date("Y-m-d"), $dtz);
echo $now->format("Y-m-d H:i:s");
ฟังก์ชัน MySQL NOW()
ส่งคืนเวลาปัจจุบัน วิธีเดียวที่ฉันพบสำหรับ PHP คือการใช้รหัสต่อไปนี้
$curr_timestamp = date('Y-m-d H:i:s');
อีกหนึ่งคำตอบฉันพบว่าใช้งานง่าย:
echo date('c');
// 2015-07-27T00:00:00+02:00
นี่คือวันที่ ISO 8601 (เพิ่มใน PHP 5)ซึ่ง MySQL ใช้
MySQL 5.7 ไม่อนุญาตเขตเวลาในวันที่และเวลาโดยค่าเริ่มต้น SQL_MODE=ALLOW_INVALID_DATES
คุณสามารถปิดการใช้งานข้อผิดพลาดด้วย ดูคำตอบได้ที่นี่สำหรับรายละเอียดเพิ่มเติม:https://stackoverflow.com/a/35944059/2103434 แต่นั่นก็หมายความว่าเขตเวลาจะหายไปเมื่อบันทึกลงในฐานข้อมูล!
โดยค่าเริ่มต้น MySQL ใช้เขตเวลาของระบบและตราบใดที่ PHP ใช้เขตเวลาเดียวกันคุณควรจะใช้ ในกรณีของฉัน CET / UTC + 2
นั่นหมายความว่าถ้าฉันแทรก2015-07-27T00:00:00+02:00
ลงในฐานข้อมูลเท่านั้น2015-07-27T00:00:00
จะถูกเก็บไว้เท่านั้น (แต่นั่นคือเวลาท้องถิ่นที่ถูกต้อง!)
เมื่อฉันโหลดเวลากลับไปที่ PHP
$importedDate = new \DateTime('2015-07-27T00:00:00')
จะถือว่าเป็น+02:00
เขตเวลาโดยอัตโนมัติเนื่องจากเป็นค่าเริ่มต้น การพิมพ์สิ่งนี้จะถูกต้องอีกครั้ง:
echo $importedDate->format('c');
// 2015-07-27T00:00:00+02:00
date_default_timezone_set('UTC');
$importedDate = new \DateTime('2015-07-27T00:00:00+02:00');
echo $importedDate->format('c');
// 2015-07-27T00:00:00+02:00
$importedDate->setTimezone(new \DateTimeZone("America/New_York"));
echo $importedDate->format('c');
// 2015-07-26T18:00:00-04:00
การใช้strftime
:
strftime("%F %T");
%F
%Y-%m-%d
เป็นเช่นเดียวกับ
%T
%H:%M:%S
เป็นเช่นเดียวกับ
นี่คือตัวอย่างของ ideone
หรือคุณสามารถใช้DateTime
ค่าคงที่ :
echo date(DateTime::W3C); // 2005-08-15T15:52:01+00:00
นี่คือรายการของพวกเขา:
ATOM = "Y-m-d\TH:i:sP" ; // -> 2005-08-15T15:52:01+00:00
COOKIE = "l, d-M-Y H:i:s T" ; // -> Monday, 15-Aug-2005 15:52:01 UTC
ISO8601 = "Y-m-d\TH:i:sO" ; // -> 2005-08-15T15:52:01+0000
RFC822 = "D, d M y H:i:s O" ; // -> Mon, 15 Aug 05 15:52:01 +0000
RFC850 = "l, d-M-y H:i:s T" ; // -> Monday, 15-Aug-05 15:52:01 UTC
RFC1036 = "D, d M y H:i:s O" ; // -> Mon, 15 Aug 05 15:52:01 +0000
RFC1123 = "D, d M Y H:i:s O" ; // -> Mon, 15 Aug 2005 15:52:01 +0000
RFC2822 = "D, d M Y H:i:s O" ; // -> Mon, 15 Aug 2005 15:52:01 +0000
RFC3339 = "Y-m-d\TH:i:sP" ; // -> 2005-08-15T15:52:01+00:00 ( == ATOM)
RFC3339_EXTENDED = "Y-m-d\TH:i:s.vP" ; // -> 2005-08-15T15:52:01.000+00:00
RSS = "D, d M Y H:i:s O" ; // -> Mon, 15 Aug 2005 15:52:01 +0000
W3C = "Y-m-d\TH:i:sP" ; // -> 2005-08-15T15:52:01+00:00
สำหรับการแก้จุดบกพร่องฉันชอบสั้นกว่า ( 3v4l.org ):
echo date('ymd\THisP'); // 180614T120708+02:00
ฉันชอบวิธีแก้ปัญหาที่โพสต์โดย user1786647 และฉันได้อัปเดตเล็กน้อยเพื่อเปลี่ยนเขตเวลาเป็นอาร์กิวเมนต์ของฟังก์ชันและเพิ่มการสนับสนุนเพิ่มเติมสำหรับการส่งผ่านเวลา Unix หรือสตริงวันที่และเวลาที่จะใช้สำหรับ datestamp ที่ส่งคืน
นอกจากนี้ยังมีตัวเลือก "setTimestamp" สำหรับผู้ใช้ที่ใช้งานเวอร์ชันต่ำกว่า PHP 5.3:
function DateStamp($strDateTime = null, $strTimeZone = "Europe/London") {
$objTimeZone = new DateTimeZone($strTimeZone);
$objDateTime = new DateTime();
$objDateTime->setTimezone($objTimeZone);
if (!empty($strDateTime)) {
$fltUnixTime = (is_string($strDateTime)) ? strtotime($strDateTime) : $strDateTime;
if (method_exists($objDateTime, "setTimestamp")) {
$objDateTime->setTimestamp($fltUnixTime);
}
else {
$arrDate = getdate($fltUnixTime);
$objDateTime->setDate($arrDate['year'], $arrDate['mon'], $arrDate['mday']);
$objDateTime->setTime($arrDate['hours'], $arrDate['minutes'], $arrDate['seconds']);
}
}
return $objDateTime->format("Y-m-d H:i:s");
}
คุณสามารถใช้ฟังก์ชัน date PHP กับรูปแบบที่ถูกต้องเป็นพารามิเตอร์
echo date("Y-m-d H:i:s");
มีในตัวไม่มี PHP now()
ฟังก์ชั่น date()
แต่คุณสามารถทำได้โดยใช้
ตัวอย่าง
function now() {
return date('Y-m-d H:i:s');
}
คุณสามารถใช้date_default_timezone_set()
หากคุณต้องการเปลี่ยนเขตเวลา
มิฉะนั้นคุณสามารถใช้ประโยชน์จากCarbon - ส่วนขยาย PHP API อย่างง่ายสำหรับ DateTime
หากคุณต้องการได้รับเวลารวมทั้งAM / PM
<?php
$time_now = date("Y-m-d h:i:s a");
echo $time_now;
?>
มันออกมา 2020-05-01 05:45:28 pm
หรือ
<?php
$time_now = date("Y-m-d h:i:s A");
echo $time_now;
?>
มันออกมา 2020-05-01 05:45:28 PM
ในไม่ช้า
echo date('Y-m-d H:i:s');
PHP ขั้นสูงตอนนี้เรียนพิเศษ addMinute addYear เช่น addHour เช่น ฯลฯ ...
<?php /** @noinspection PhpUnhandledExceptionInspection */
/**
* Class Now
* @author dılo sürücü <berxudar@gmail.com>
*/
class Now
{
/**
* @var DateTime
*/
private $dateTime;
/**
* Now constructor.
* @throws Exception
*/
public function __construct()
{
$this->dateTime = new DateTime('now');
}
/**
* @param int $year
* @return Now
* @throws Exception
* @noinspection PhpUnused
*/
public function addYear(int $year): self
{
$this->dateTime->add(new DateInterval('P' . $year . 'Y'));
return $this;
}
/**
* @noinspection PhpUnused
* @param int $month
* @return Now
* @throws Exception
* @noinspection PhpUnused
*/
public function addMonth(int $month):self
{
$this->dateTime->add(new DateInterval('P' . $month . 'M'));
return $this;
}
/**
* @param int $day
* @return $this
* @throws Exception
*/
public function addDay(int $day): self
{
$this->dateTime->add(new DateInterval('P' . $day . 'D'));
return $this;
}
/**
* @noinspection PhpUnused
* @param int $week
* @return $this
* @throws Exception
*/
public function addWeek(int $week): self
{
return $this->addDay($week * 7);
}
/**
* @noinspection PhpUnused
* @param int $second
* @return $this
* @throws Exception
*/
public function addSecond(int $second): self
{
$this->dateTime->add(new DateInterval('PT' . $second . 'S'));
return $this;
}
/**
* @param int $minute
* @return $this
* @throws Exception
*/
public function addMinute(int $minute): self
{
$this->dateTime->add(new DateInterval('PT' . $minute . 'M'));
return $this;
}
/**
* @param int $hour
* @return $this
* @throws Exception
*/
public function addHour(int $hour): self
{
$this->dateTime->add(new DateInterval('PT' . $hour . 'H'));
return $this;
}
/**
* @return string
*/
public function get(): string
{
return $this->dateTime->format('Y-m-d H:i:s');
}
/**
* @return string
*/
public function __toString()
{
return $this->get();
}
}
/**
* @return Now
* @throws Exception
*/
function now()
{
return new Now();
}
การใช้
echo now(); //2020-03-10 22:10
echo now()->addDay(1); //2020-03-11 22:10
echo now()->addDay(1)->addHour(1); // //2020-03-11 23:10
echo now()->addDay(1)->addHour(1)->addMinute(30); // //2020-03-11 23:40
echo now()->addDay(1)->addHour(1)->addMinute(30)->addSecond(10); // //2020-03-11 23:50
//or u can use get method for example
echo now()->addDay(1)->addHour(1)->addMinute(30)->get(); // //2020-03-11 23:40
PHP ที่เทียบเท่าคือtime()
: http://php.net/manual/en/function.time.php
time() Returns the current time measured in the number of seconds since the Unix Epoch (January 1 1970 00:00:00 GMT).