PHP: лучший анализатор даты, чем strtotime - PullRequest
4 голосов
/ 27 августа 2009

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

Единственное, что я нашел, это strtotime , и оно не подходит, поскольку угадывает формат даты. Я действительно не доверяю части "угадай". Более того, мой строковый ввод представлен во французском формате (дд / мм / аааа), который, кажется, не совсем понятен (он анализирует американские форматы, такие как мм / дд / аааа).

То, что я ищу, - это функция, которая принимает на вход строку даты и формат для анализа. Я мог бы сделать это сам с помощью регулярного выражения, но я не могу поверить, что его уже нет.

Я нашел:

  • DateTime :: createFromFormat () . Но он работает только с PHP 5.3, и у меня нет возможности обновить версию PHP (5.2)
  • strptime () . Этот метод делает то, что я хочу, но не реализован на платформе Windows (кстати: WTF ??)

Есть предложения?

Ответы [ 6 ]

4 голосов
/ 27 августа 2009

Извлечь Zend_Date , что позволяет указать формат при установке даты. Помимо констант для многих распространенных форматов , вы можете указать и свои собственные .

$date = new Zend_Date();
$date->set('27/08/2009','DD/MM/YYYY');
4 голосов
/ 27 августа 2009

К сожалению, кажется, что такой анализ лучше сделать вручную , взорвав строку в слэше, а затем переключив день и месяц.

1 голос
/ 05 августа 2010

Я сам написал класс, думаю, вы найдете хорошую версию в gadmdatecommand.php в http://sourceforge.net/projects/phpdbedittk

Что касается комментариев здесь, чтобы просто взорваться на '/' и поменять число, это не так просто. Если вы предлагаете ввести даты в поле ввода, вы можете получить - в зависимости от местонахождения пользователя и приложения

1/7/2010 1.7.2010 1-7-2010 15 июля 1 июля 2010 1/6/8

и многие другие варианты. Я решил эту проблему (по крайней мере, для меня успешно) путем создания форматов даты, каждый из которых имеет а) регулярное выражение, соответствующее формату б) преобразователь массива, который соответствует скобкам регулярного выражения в части даты (день, месяц, минута, am / pm) в) выходной формат для даты ()

НТН

1 голос
/ 27 августа 2009

Следующий комментарий от php.net о strtotime может помочь:

Не для дат за пределами США, где порядок не определен, такой как 01/02/2003 - разбирает это как 1 февраля, а не 2 января.

Если вы анализируете даты за пределами США локаль, вы можете перевернуть эти элементы ваша дата:

<?php 
$y = $_POST['date']; 
if (preg_match('/^\s*(\d\d?)[^\w](\d\d?)[^\w](\d{1,4}\s*$)/', $y, $match)) { 
  $y = $match[2] . '/' . $match[1] . '/' . $match[3]; 
} 
echo date('d # m # Y', strtotime($y)); 
?> 

ВНИМАНИЕ: Выше работает только для дат, и перерывы на время: 12:30:01 будет преобразуется в 30/12/01.

0 голосов
/ 04 сентября 2013

strptime():
Внутренне эта функция вызывает функцию strptime (), предоставляемую системной библиотекой C. Эта функция может демонстрировать (! ) заметно различное поведение в разных операционных системах. Использование date_parse_from_format(), которое не страдает от этих проблем, рекомендуется в PHP 5.3.0 и более поздних версиях .
http://www.php.net/manual/en/function.strptime.php

0 голосов
/ 27 августа 2009

Если вы знаете, что введенный вами формат даты будет в английском формате, вы можете обработать его в более стандартный формат даты. Простой анализ от 24/7/2007 до 2007-07-24 тривиален. Взорвитесь с косой чертой и поместите части в правильное место. Я точно знаю, что strtotime правильно проанализирует 2007-07-24.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...