Преобразовать строку в метку времени UNIX - PullRequest
2 голосов
/ 24 ноября 2011

Я пытаюсь преобразовать строку 11/24/2011 @ 01:15pm в метку времени UNIX.Формат m-d-Y @ h:ia

Я не могу заставить strtotime работать со строкой.Есть ли способ отменить функцию данных?Является ли я единственным выбором для создания новой не php-функции по умолчанию для преобразования строки?

На сервере установлены CentOS 5, Apache 2.2 и PHP 5.2.17.

Ответы [ 5 ]

4 голосов
/ 24 ноября 2011

Используйте более современный класс DateTime (при условии, что вы используете> = 5.3).

$unix = DateTime::createFromFormat('m/d/Y @ h:ia', '11/24/2011 @ 01:15pm')
        ->getTimestamp();

CodePad .

2 голосов
/ 24 ноября 2011

В PHP 5.2 вы можете использовать strptime для анализа строки даты и времени с определенным форматом, а затем использовать mktime для преобразования результата в метку времени.

$timeString = '11/24/2011 @ 01:15pm';

$timeArray = strptime($timeString, '%m/%d/%Y @ %I:%M%p');
$timestamp = mktime(
    $timeArray['tm_hour'], $timeArray['tm_min'], $timeArray['tm_sec'], 
    $timeArray['tm_mon']+1, $timeArray['tm_mday'], $timeArray['tm_year']+1900
);

Это должно быть абстрагировано как функция, возможно две:

function strptimestamp($date, $fmt) {
    $timeArray = strptime($date, $fmt);
    return mktime(
        $timeArray['tm_hour'], $timeArray['tm_min'], $timeArray['tm_sec'], 
        $timeArray['tm_mon']+1, $timeArray['tm_mday'], $timeArray['tm_year']+1900
    );
}

function strpmy($date) {
    return strptimestamp($date, '%m/%d/%Y @ %I:%M%p');
}

Поддержка синтаксического анализа сокращения периода, кажется, варьируется от ОС к ОС.Если вышеприведенное не работает в конкретной ОС, попробуйте «% P» вместо «% p» или передайте строку времени через strtoupper (или обе).Следующее должно работать под любой ОС, хотя предпочтительно получить strptime для обработки всего синтаксического анализа, поскольку следующее менее подходит в качестве основы для общей функции strptimestamp.

static $pm_abbrevs = array('pm' => 1, 'p.m.' => 1, 'µµ' => 1, 'µ.µ.' => 1);
$timeString = '11/24/2011 @ 01:15pm';

$timeArray = strptime($timeString, '%m/%d/%Y @ %I:%M');
$period = strtolower($timeArray['unparsed']);
if (isset($pm_abbrevs[$period])) {
    $timeArray['tm_hour'] += 12; 
}
$timestamp = mktime(
    $timeArray['tm_hour'], $timeArray['tm_min'], $timeArray['tm_sec'], 
    $timeArray['tm_mon']+1, $timeArray['tm_mday'], $timeArray['tm_year']+1900
);
0 голосов
/ 30 апреля 2013
$search = array('/',',','@');
$replace = array('-','','');
echo strtotime( str_replace($search,$replace,'16/7/2013 @ 7:30AM') );

это заменит части строки во временной строке, которую вы пытаетесь преобразовать в формат, приемлемый для strtotime. Вы всегда можете добавить больше строк, которые хотите заменить, в массивы.

Также вам не нужно иметь последнюю версию php для этого.

Выход:

1373952600
0 голосов
/ 24 ноября 2011

Чувствительность к регистру может быть вашей проблемой http://php.net/manual/en/datetime.formats.php. Возможно, сначала введите $ x через strtoupper(), затем str_replace('@', '', $x) (обратите внимание, что вместо @ он заменяется пустой строкой), затем попробуйте strtotime().Надеюсь, это поможет.

0 голосов
/ 24 ноября 2011

Если вы замените '@' пробелом, то strtotime сможет понять его изначально.

<?php
$x = "11/24/2011 @ 01:15pm";
$x = str_replace(" @ ", " ", $x);
$y = strtotime($x);
$z = date("m-d-Y @ h:ia", $y);
echo "x: $x<br />\n";
echo "y: $y<br />\n";
echo "z: $z<br />\n";
?>

Выход:

x: 11/24/2011 01:15pm
y: 1322140500
z: 11-24-2011 @ 01:15pm
...