Tarih ve saati MySQL işleviyle aynı biçimde döndüren bir PHP işlevi var mı NOW()
?
Bunu kullanarak nasıl yapacağımı biliyorum date()
, ama sadece bunun için bir fonksiyon olup olmadığını soruyorum.
Örneğin, geri dönmek için:
2009-12-01 00:00:00
Tarih ve saati MySQL işleviyle aynı biçimde döndüren bir PHP işlevi var mı NOW()
?
Bunu kullanarak nasıl yapacağımı biliyorum date()
, ama sadece bunun için bir fonksiyon olup olmadığını soruyorum.
Örneğin, geri dönmek için:
2009-12-01 00:00:00
Yanıtlar:
Tarih fonksiyonunun yanı sıra :
date("Y-m-d H:i:s");
date_default_timezone_set
Fonksiyonu kullanmanız gerekebileceğini unutmayın
date('Y-m-d H:i:s')
Daha fazla ayrıntı için buraya bakın: http://pl.php.net/manual/en/function.date.php
PHP sürüm> = 5.4 ile DateTime bunu yapabilir: -
echo (new \DateTime())->format('Y-m-d H:i:s');
Bu işlevi kullanın:
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');
}
Bunu dene:
date("Y-m-d H:i:s");
Kısa cevap
$now = date_create()->format('Y-m-d H:i:s');
Uzun cevap için aşağıyı okuyun.
PHP'de MySQL NOW () işlevinin taklidi
PHP'de MySQL NOW()
işlevini taklit eden yolların bir listesi .
// 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);
Bunun date_create()->format('Y-m-d H:i:s')
en iyi yol olduğunu düşünüyorum çünkü bu yaklaşım zaman / zaman dilimi manipülasyonlarını daha kolay idare etmenizi sağlıyor date('Y-m-d H:i:s')
ve php 5.2'den beri çalışıyor.
MySQL işlevi NOW()
bu biçimde dateTime değerini verir: 'YYYY-MM-DD HH:MM:SS'
. Buraya bakın: https://dev.mysql.com/doc/refman/8.0/en/date-and-time-functions.html#function_now .
İlginç bir gerçek, bu sorguyu çalıştırarak datetime biçimini elde etmenin mümkün olmasıdır: SHOW VARIABLES LIKE 'd%e_format'
sonuç şu şekilde olabilir:
Variable_name Value
date_format %Y-%m-%d
datetime_format %Y-%m-%d %H:%i:%s
Buradaki değişkenler salt okunur değişkenlerdir. Yani değiştiremezsiniz.
MySQL NOW()
işlevinin biçimini datetime_format
değişkenden aldığını tahmin ediyorum .
Date () özeti yerine date_create () -> format () 'nın avantajları
Elverişli gerçekler date_create('now')->format('Y-m-d H:i:s')
üzerinde date('Y-m-d H:i:s')
şunlardır:
Date_create () -> format () yerine date () dezavantajları
Fonksiyon date()
biraz daha iyi bir performansa sahiptir date_create()->format()
. Aşağıdaki karşılaştırma testine bakın.
$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
Büyük harf bunun date()
daha hızlı olduğunu gösterir . Ancak, test senaryosunu biraz değiştirirsek, sonuç farklı olacaktır. Aşağıya bakınız:
$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 yöntemi: format()
burada daha hızlıdır date()
.
Date (create () -> format () 'ın yerine date () ayrıntılı
Ayrıntılı açıklama için okumaya devam edin.
zaman manipülasyonlarını yönetmek daha kolay
date_create()
göreceli bir tarih / saat biçimini kabul (gibi now
, yesterday
ya +1 day
bakınız) bu bağlantıyı , örnek:
$tomorrow = date_create('+1 day')->format('Y-m-d H:i:s');
date()
aşağıdaki gibi göreli bir tarih / saat biçimini de kabul eder:
$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
zaman dilimlerini yönetmek daha kolay
Zaman dilimleri önemli olduğunda , yönerge içinde yapılandırılmış olan varsayılan saat dilimini kullandığından , kullanımı date_create()->format()
çok daha mantıklıdır . Bağlantı: http://php.net/manual/tr/datetime.configuration.php#ini.date.timezone .date()
date()
php.ini
date.timezone
Çalışma zamanı sırasında saat dilimini değiştirmek mümkündür. Misal:
date_default_timezone_set('Asia/Tokyo');
.
Bunun dezavantajı, tüm tarih / saat işlevlerini etkileyecek olmasıdır. date_create()->format()
İle birlikte kullanıyorsanız , bu sorun yok timezone_open()
.
PHP büyük zaman dilimlerini destekler. Komik olan şey, Arktik çemberini ve Antarktika'yı bile desteklemesi. Hiç duydun Longyearbyen
mu? Değilse, endişelenmeyin, resmi PHP belgelerini okuyana kadar ben de yapmadım.
$nowLongyearbyen = date_create('now', timezone_open('Arctic/Longyearbyen'))->format('Y-m-d H:i:s');
Desteklenen tüm zaman dilimlerinin listesine bakın: http://php.net/manual/en/timezones.php .
öldürmezler
OOP, durum dolu Nesneler kullanır. Bu şekilde düşünmeyi tercih ediyorum:
// 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');
Sonra şu şekilde düşünün:
// 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'));
Bu nedenle date_create()->format()
yaklaşımın benim için daha okunaklı olduğunu söyleyebilirim date()
.
date_create () VS yeni DateTime ()
Elverişli gerçekler date_create()
üzerinde new DateTime()
şunlardır:
Ad alanları
Bir ad alanında çalışıyorsanız ve yeni bir anahtar sözcükle bir DateTime nesnesi başlatmak istiyorsanız, bunu şu şekilde yapmanız gerekir:
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();
Bununla ilgili yanlış bir şey yok, ancak yukarıdakilerin dezavantajı, insanların ters eğik çizgi hakkında sporadik olarak unutmalarıdır. date_create()
Yapıcı işlevini kullanarak ad alanları hakkında endişelenmenize gerek yoktur.
$dt = date_create(); // in or not in a namespace it works in both situations
Date_create () -> format () örneği
Bir diziyi doldurmam gerekirse projelerim için bu yaklaşımı kullanıyorum. Bunun gibi:
$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'),
);
MySQL işlevi NOW()
geçerli zaman damgasını döndürür. PHP için bulduğum tek yol aşağıdaki kodu kullanmaktır.
$curr_timestamp = date('Y-m-d H:i:s');
Bir cevap daha kullanımı kolay buluyorum:
echo date('c');
// 2015-07-27T00:00:00+02:00
Bu, MySQL'in kullandığı ISO 8601 tarihidir (PHP 5'e eklenmiştir)
MySQL 5.7 varsayılan olarak tarih saatinde saat dilimine izin vermez. Hatayı ile devre dışı bırakabilirsiniz SQL_MODE=ALLOW_INVALID_DATES
. Daha fazla ayrıntı için cevaba bakınız: https://stackoverflow.com/a/35944059/2103434 . Ancak bu, veritabanına kaydederken saat diliminin kaybedileceği anlamına da gelir!
Varsayılan olarak MySQL, sistemin saat dilimini kullanır ve PHP aynı saat dilimini kullandığı sürece iyi olmanız gerekir. Benim durumumda CET / UTC + 2.
Bu 2015-07-27T00:00:00+02:00
, veritabanına eklersem, yalnızca 2015-07-27T00:00:00
depolanacağı anlamına gelir (ancak bu doğru yerel saattir!).
Zamanı PHP'ye geri yüklediğimde,
$importedDate = new \DateTime('2015-07-27T00:00:00')
varsayılan olduğundan otomatik olarak +02:00
saat dilimini varsayar . Bunu yazdırmak tekrar doğru olacaktır:
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
Veya DateTime
sabitleri kullanabilirsiniz :
echo date(DateTime::W3C); // 2005-08-15T15:52:01+00:00
İşte bunların listesi:
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
Hata ayıklama için daha kısa olanı tercih ederim ( 3v4l.org ):
echo date('ymd\THisP'); // 180614T120708+02:00
Ben user1786647 tarafından gönderilen çözümü seviyorum ve ben bir işlev argümanına saat dilimini değiştirmek ve döndürülen tarih damgası için kullanmak için bir Unix zaman veya datetime dize geçirmek için isteğe bağlı destek eklemek için biraz güncelledim.
Ayrıca PHP 5.3'ten daha düşük bir sürüm çalıştıran kullanıcılar için "setTimestamp" için bir geri dönüş içerir:
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");
}
Yerleşik PHP now()
işlevi yoktur, ancak bunu kullanarak yapabilirsiniz date()
.
Misal
function now() {
return date('Y-m-d H:i:s');
}
date_default_timezone_set()
Saat dilimini değiştirmeniz gerekirse kullanabilirsiniz .
Aksi takdirde, Carbon - DateTime için basit bir PHP API uzantısı kullanabilirsiniz.
kısaca
echo date('Y-m-d H:i:s');
php gelişmiş şimdi sınıf ekstra addMinute addYear gibi addHour vb ...
<?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();
}
kullanma
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 eşdeğeri 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).