Необходимо переписать функцию отображения даты

У меня есть следующая функция, которую я написал пару лет назад. Это займет время от моего db и отображает его в лучшем форматированном виде.

function formatTime($dateTime){ // show time only if posted today if (date('Ymd') == date('Ymd', strtotime($dateTime))) { $dt = date('g:i a', strtotime($dateTime)); } else { // if not the same year show YEAR if (date('Y') == date('Y', strtotime($dateTime))) { $dt = date('M j', strtotime($dateTime)); } else { $dt = date('M j, Y', strtotime($dateTime)); } } return $dt; } 

Я использую время сервера, для меня это CST. Вчера у меня появился пользователь из Австралии, указывающий на то, что для него это не было сделано с тех пор, как он двигался в совершенно другой часовой пояс, фактически на следующий день (по сравнению с моим выходом в определенное время :).

Я решил переписать свою функцию, чтобы сказать что-то вроде:

  • если минута> секунды назад
  • если через час> # минут назад
  • между 1 -2 часа> больше часа назад
  • 2 – 24 hrs> день назад
  • 2 – 7 дней> # дня назад
  • 7 дней – месяц> # недели назад
  • 1 – 2 месяца> более месяца
  • после этого я могу просто показать дату

Есть ли какие-либо функции, которые вы, возможно, знаете об этом, если не так, как я могу изменить это?

Благодарю.

 function formatTime ($dateTime) { // A Unix timestamp will definitely be required $dateTimeInt = strtotime($dateTime); // First we need to get the number of seconds ago this was $secondsAgo = time() - $dateTimeInt; // Now we decide what to do with it switch (TRUE) { case $secondsAgo < 60: // Less than a minute return "$secondsAgo seconds ago"; case $secondsAgo < 3600: // Less than an hour return floor($secondsAgo / 60)." minutes ago"; case $secondsAgo < 7200: // Less than 2 hours return "over an hour ago"; case $secondsAgo < 86400: // Less than 1 day return "1 day ago"; // This makes no sense, but it is what you have asked for... case $secondsAgo < (86400 * 7): // Less than 1 week return floor($secondsAgo / 86400)." days ago"; case $secondsAgo < (86400 * 28): // Less than 1 month - for the sake of argument let's call a month 28 days return floor($secondsAgo / (86400 * 7))." weeks ago"; case $secondsAgo < (86400 * 56): // Less than 2 months return "over a month ago"; default: return date('M j, Y', $dateTimeInt); } } 

Это отнюдь не безупречно, тем более что одно из ваших требований не имеет смысла (см. Комментарии), но, надеюсь, оно должно дать вам толчок в правильном направлении и проиллюстрировать, как вы можете использовать switch чтобы вы могли легко добавлять и удалять пунктов / вариантов поведения.