форматирование отметки времени mysql в php с несколькими условиями - PullRequest
2 голосов
/ 14 апреля 2011

Я пытаюсь отформатировать временную метку SQL в PHP на основе следующих условий, но не могу понять, как это сделать. Кто-нибудь может указать мне правильное направление?

  1. Если отметка времени была СЕГОДНЯ, отображается как 16:15 или 12:30
  2. Если отметка времени была до СЕГОДНЯ, но за последние 7 ДНЕЙ, укажите «Воскресенье» или «Понедельник»
  3. Если временная метка была раньше 7 дней назад, укажите как «мм / дд / гг»

Как бы я поступил об этом?

Ответы [ 4 ]

1 голос
/ 14 апреля 2011

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

$timestamp = strtotime($dbTimestamp);

Это вернет метку времени Unix , с которой вы можете играть.

Далее мы определим еще пару временных отметок, чтобы сравнить это значение с:

Во-первых, мы хотим знать отметку времени для полуночи сегодня утром. Для этого вы передадите строку "сегодня" в strtotime:

$today = strtotime("today");

Далее нам нужно знать метку времени на семь дней назад. Вам придется выбирать между "1 week ago" и "1 week ago midnight". Разница между этими двумя заключается в том, что midnight вернет отметку времени для 12:00 в тот день, в то время как версия без нее вернет текущее время , семь дней назад (например, сегодня разница будет в том, что midnight вернется в 12:00 7 апреля, а версия, не относящаяся к полуночи, прямо сейчас вернется в 15:45 7 апреля):

$weekAgo = strtotime("1 week ago midnight");

(Обратите внимание: существует много форматов , которые strtotime понимает, включая множество относительных форматов , таких как примеры "сегодня" и "1 неделя назад", использованные выше.)

Далее нам нужно определить форматы даты для использования в каждом случае:

$timeOnly = "g:i A"; // This gives an "hour:minute AM/PM" format, e.g. "6:42 PM"
$dayOfWeek = "l"     // Gives a full-word day of the week, e.g. "Sunday"
$mdy = "m/d/Y"       // gives two-digit month and day, and 4-digit year,
                     // separated by slashes, e.g. "04/14/2011"

Наконец, мы просто проводим сравнение и форматируем нашу метку времени, используя date функцию :

if ($timestamp >= $today) {
  $date = date($timeOnly, $timestamp);
} elseif ($timestamp >= $weekAgo) {
  $date = date($dayOfWeek, $timestamp);
} else {
  $date = date($mdy, $timestamp);
}

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

1 голос
/ 14 апреля 2011

Сначала вам нужно преобразовать время MySQL в метку времени Unix, что и используется большинством функций даты php.Если вы используете тип MySQLs DateTime, вы можете выполнить преобразование в SQL с помощью функции MySQL unix_timestamp () mysql date functions .Или вы можете преобразовать дату mysql в отметку времени unix в PHP с помощью функции strtotime ($ mysqlDateTime) функция php strtotime

, если у вас есть отметка времени unix того времени, которое вы хотите отформатироватьпреобразование будет выглядеть примерно так (86400 - это количество секунд в 24 часах):

function displayDate($timestamp)
{
    $secAgo = time() - $timestamp;
    // 1 day
    if ($secAgo < 86400)
        return date('h:i:A', $timestamp);
    // 1 week
    if ($secAgo < (86400 * 7))
       return date('l', $timestamp);
    // older than 1 week
    return date('m/t/y', $timestamp);
}

Этот метод имеет то преимущество, что не требует создания дополнительных объектов в PHP (немного медленнее) или выполнения ненужных вычисленийна сервере SQL.Также может быть полезно знать, что тип метки времени MySQL хранит данные в виде метки времени unix (количество секунд с 1 января 1970 года), для хранения которой требуется только 32 бита по сравнению с датой и временем, в которой используется 64 бита.32 бита должно хватить каждому, до 2038 года или около того ...

1 голос
/ 14 апреля 2011

Вам просто нужно использовать условное выражение:

$now = new DateTime("now");
$ystrday = new DateTime("yesterday");
$weekAgo = new DateTime("now")->sub(new DateInterval('P7D'));
$inputDate = new DateTime(whenever);

if($yesterday < $inputDate and $inputDate < $now){
    $outDate = date('g:ia', $inputDate->getTimestamp() );
}else if($weekAgo < $inputDate and $inputDate < $now){
    $outDate = date('l', $inputDate->getTimestamp() );
}else if($inputDate < $weekAgo){
    $outDate = date('d/m/y', $inputDate->getTimestamp() );
}

Это не было проверено, и вам нужно будет поместить вашу дату mySql в объект php DateTime, но она должна приблизить вас.

1 голос
/ 14 апреля 2011

Вы можете проверить разницу в датах с помощью diff () PHP или msql datediff ()

http://www.php.net/manual/en/datetime.diff.php

Затем проверьте разницу, равную нулю или равную 1 или превышающую 7

h 12-hour format of an hour with leading zeros 01 through 12 date('H:i:s')
i Minutes with leading zeros 00 to 59 
s Seconds, with leading zeros 00 through 59 

G 24-hour format of an hour without leading zeros 0 through 23 

USE DATE(G) to find AM or PM

if($TODAY)
date('h:i:s')PM
ELSE IF ($THISWEEK)
l (lowercase 'L') A
 full textual representation of the day of the week Sunday through Saturday 
ELSE IF($BEFOREONEWEEK)
date('d-m-y')

http://php.net/manual/en/function.date.php

Это должно работать.Надеюсь, что так: -)

...