php getdate () против даты () - PullRequest
       9

php getdate () против даты ()

5 голосов
/ 09 апреля 2011

Теоретический вопрос.

Представь себе ситуацию. Мне нужно получить сегодняшнюю дату и время (не сейчас, а сегодня - начало дня). Я могу сделать это с помощью этого кода:

$now = time();
$today = date('Y-m-d H:i:s', mktime(0, 0, 0, date("m", $now), date("d", $now), date("Y", $now)));

или это:

$now = getdate();
$today = date('Y-m-d H:i:s', mktime(0, 0, 0, $now['mon'], $now['mday'], $now['year']));

В большинстве примеров, которые я видел, используется первый способ. Вопрос прост: почему? Первый использует 3 вызова функции больше, чтобы получить месяц, день и год.

1 Ответ

13 голосов
/ 09 апреля 2011

Обе эти опции довольно ужасны - если вы пытаетесь получить текущую дату в полночь в виде отформатированной строки, это так просто:

date('Y-m-d') . ' 00:00:00';

Или, если вы хотите быть немного более явным,

date('Y-m-d H:i:s', strtotime('today midnight'));

Нет необходимости делать эту дурацкую вещь mktime. Кто бы ни написал этот код, он не знает, что делает, и / или является разработчиком копирования-вставки / Cargo-Cult. Если вы действительно видите это в «большинстве примеров», то толпа, с которой вы тусуетесь, глубоко обеспокоена , и вам, вероятно, следует прекратить тусоваться с ними.

Единственная интересная вещь, которую mktime делает, это попытка работать с местным часовым поясом. Если ваша работа зависит от часового пояса, и вы работаете с PHP 5.3 или выше, рассмотрите возможность работы с DateTime и DateTimeZone . Демонстрация из интерактивной подсказки PHP:

php > $utc = new DateTimeZone('UTC');
php > $pdt = new DateTimeZone('America/Los_Angeles');
php > $midnight_utc = new DateTime('today midnight', $utc);
php > $midnight_utc->setTimeZone($pdt);
php > echo $midnight_utc->format('Y-m-d H:i:s');
2011-04-08 17:00:00

(На данный момент это 9-е место в UTC, а в PDT - 8-е).

...