date_parse_from_format

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

date_parse_from_formatBelirtildiği gibi biçimlendirilmiş olarak tarih hakkında bilgi verir

Açıklama

date_parse_from_format(string $biçem, string $zaman): array

Belirtilen zamanla ilgili ayrıntılı bilgiyi ilişkisel bir dizi ile döndürür.

Bağımsız Değişkenler

biçem

biçem kullanımı hakkında bilgi DateTimeImmutable::createFromFormat() sayfasındadır. Aynı kurallar uygulanır.

zaman

Zamanı gösteren dizge.

Dönen Değerler

Belirtilen zaman hakkında ayrıntılı bilgiyi ilişkisel dizi ile döndürür.

Döndürülen dizi year (yıl), month (ay), day (gün), hour (saat), minute (dakika), second (saniye), fraction (saniyenin kesri), is_localtime (yerel zaman) alanlarını içerir.

is_localtime değeri mevcutsa zone_type anahtarındaki değer zaman diliminin türünü içerir. Zaman dilimi türü 1 (UTC) ise zone (bölge) ve is_dst (hedef mi) alanları, 2 (kısaltma) için tz_abbr (zaman dilimi kısaltması) ve is_dst (hedef mi) alanları ve 3 (zaman dilimi belirteci) için tz_abbr (zaman dilimi kısaltması) ve tz_id (zaman dilimi kimliği) alanları eklenir.

Dizi, warning_count (uyarı sayısı) ve warnings (uyarılar) alanlarını da içerir. İlki kaç uyarı olduğunu belirtir. warnings dizisinin anahtarları belirtilen zamanda uyarının oluştuğu konumu ve uyarıyı içeren dizgeyi belirtir. Aşağıdaki örneklerden biri böyle bir uyarıyı içermektedir.

Dizi ayrıca, error_count (hata sayısı) ve errors (hatalar) alanlarını da içerir. İlki kaç hata bulunduğunu belirtir. errors dizisinin anahtarları belirtilen zamanda hatanın oluştuğu konumu ve hatayı içeren dizgeyi belirtir. Aşağıdaki örneklerden biri böyle bir hatayı içermektedir.

Uyarı

warnings ve errors dizilerinin öğe sayısı bunlar aynı konumda oluşmuşsa warning_count veya error_count değerinden az olamaz.

Hatalar/İstisnalar

zaman değeri NULL (\0) baytını içeriyorsa ValueError istisnası oluşur.

Sürüm Bilgisi

Sürüm: Açıklama
8.0.21, 8.1.8, 8.2.0 zaman değeri NULL (\0) baytını içeriyorsa artık ValueError istisnası oluşuyor, evvelce sessizce yok sayılırdı.
7.2.0 Dönen dizinin zone öğesi artık dakika değil saniye cinsinden değer içeriyor ve imi ters oluyor. Örneğin, -120 yerine artık 7200 dönüyor.

Örnekler

Örnek 1 - date_parse_from_format() örneği

<?php
$date
= "6.1.2009 13:00+01:00";
print_r(date_parse_from_format("j.n.Y H:iP", $date));
?>

Yukarıdaki örneğin çıktısı:

Array
(
    [year] => 2009
    [month] => 1
    [day] => 6
    [hour] => 13
    [minute] => 0
    [second] => 0
    [fraction] =>
    [warning_count] => 0
    [warnings] => Array
        (
        )

    [error_count] => 0
    [errors] => Array
        (
        )

    [is_localtime] => 1
    [zone_type] => 1
    [zone] => 3600
    [is_dst] =>
)

Örnek 2 - Uyarılı date_parse_from_format() örneği

<?php
$date
= "26 August 2022 22:30 pm";
$parsed = date_parse_from_format("j F Y G:i a", $date);

echo
"Uyarı sayısı: ", $parsed['warning_count'], "\n";
foreach (
$parsed['warnings'] as $position => $message) {
echo
"\t{$position} konumunda: {$message}\n";
}
?>

Yukarıdaki örneğin çıktısı:

Uyarı sayısı: 1
	23 konumunda: The parsed time was invalid

Örnek 3 - Hatalı date_parse_from_format() örneği

<?php
$date
= "26 August 2022 CEST";
$parsed = date_parse_from_format("j F Y H:i", $date);

echo
"Hata sayısı: ", $parsed['error_count'], "\n";
foreach (
$parsed['errors'] as $position => $message) {
echo
"\t{$position} konumunda: {$message}\n";
}
?>

Yukarıdaki örneğin çıktısı:

Hata sayısı: 3
	15 konumunda: A two digit hour could not be found
	19 konumunda: Data missing

Ayrıca Bakınız

add a note add a note

User Contributed Notes 2 notes

up
20
Archetrix
10 years ago
For use in Versions prior V5.3:

<?php
if (!function_exists('date_parse_from_format')) {

    function
date_parse_from_format($format, $date) {
       
// reverse engineer date formats
       
$keys = array(
           
'Y' => array('year', '\d{4}'),
           
'y' => array('year', '\d{2}'),
           
'm' => array('month', '\d{2}'),
           
'n' => array('month', '\d{1,2}'),
           
'M' => array('month', '[A-Z][a-z]{3}'),
           
'F' => array('month', '[A-Z][a-z]{2,8}'),
           
'd' => array('day', '\d{2}'),
           
'j' => array('day', '\d{1,2}'),
           
'D' => array('day', '[A-Z][a-z]{2}'),
           
'l' => array('day', '[A-Z][a-z]{6,9}'),
           
'u' => array('hour', '\d{1,6}'),
           
'h' => array('hour', '\d{2}'),
           
'H' => array('hour', '\d{2}'),
           
'g' => array('hour', '\d{1,2}'),
           
'G' => array('hour', '\d{1,2}'),
           
'i' => array('minute', '\d{2}'),
           
's' => array('second', '\d{2}')
        );

       
// convert format string to regex
       
$regex = '';
       
$chars = str_split($format);
        foreach (
$chars AS $n => $char) {
           
$lastChar = isset($chars[$n - 1]) ? $chars[$n - 1] : '';
           
$skipCurrent = '\\' == $lastChar;
            if (!
$skipCurrent && isset($keys[$char])) {
               
$regex .= '(?P<' . $keys[$char][0] . '>' . $keys[$char][1] . ')';
            } else if (
'\\' == $char) {
               
$regex .= $char;
            } else {
               
$regex .= preg_quote($char);
            }
        }

       
$dt = array();
       
$dt['error_count'] = 0;
       
// now try to match it
       
if (preg_match('#^' . $regex . '$#', $date, $dt)) {
            foreach (
$dt AS $k => $v) {
                if (
is_int($k)) {
                    unset(
$dt[$k]);
                }
            }
            if (!
checkdate($dt['month'], $dt['day'], $dt['year'])) {
               
$dt['error_count'] = 1;
            }
        } else {
           
$dt['error_count'] = 1;
        }
       
$dt['errors'] = array();
       
$dt['fraction'] = '';
       
$dt['warning_count'] = 0;
       
$dt['warnings'] = array();
       
$dt['is_localtime'] = 0;
       
$dt['zone_type'] = 0;
       
$dt['zone'] = 0;
       
$dt['is_dst'] = '';
        return
$dt;
    }

}
?>

Not my invention though. I found it here: http://stackoverflow.com/questions/6668223/php-date-parse-from-format-alternative-in-php-5-2

Thought this might be a good place to keep a copy in case someone stumbles upon the same problem facing outdated PHP versions on customer servers ....
up
1
gilles dot migliori at gmail dot com
6 years ago
$date = "10 October 2018 19:30 pm";
print_r (date_parse_from_format("j F Y G:i a", $date));

Output:

Array (
    [year]          => 2018
    [month]         => 10
    [day]           => 10
    [hour]          => 31
    [minute]        => 30
    [second]        => 0
    [fraction]      =>
    [warning_count] => 1
    [warnings]      => Array (
                        [24] => The parsed time was invalid
                    )
    [error_count]   => 0
    [errors]        => Array ( )
    [is_localtime]  =>
)

19:30 pm is invalid, 24-hour format of an hour can't be used with am/pm

must be replaced with:

$date = "10 October 2018 19:30";
print_r (date_parse_from_format("j F Y G:i", $date));

or:

$date = "10 October 2018 7:30 pm";
print_r (date_parse_from_format("j F Y g:i a", $date));
To Top