Существует ли встроенная функция / класс PHP с поддержкой локали для вывода «1 час», «25 минут», «3 дня» и т. Д. c.? - PullRequest
1 голос
/ 09 февраля 2020

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

Проблемы:

  1. Моя функция выводит только английский и английский языки. Если он существует, я хотел бы получить вывод для всех других языков / локалей.
  2. Хотя это обычно не имеет значения, из-за природы "неопределенной" строки, такой как "1 год" "или" 7 месяцев ", для очень больших промежутков времени, мой метод не обрабатывает, например, високосные годы правильно. Если я выбрал параметр «дни» в качестве единицы, и между двумя временными метками будет много лет, число дней, безусловно, будет на много дней больше.

Я вполне уверен, что Класс DateTime PHP или что-то в этом роде, но я не смог найти такую ​​функцию. Так что, возможно, его не существует.

Я хочу что-то вроде:

echo human_friendly_time_string('2020-02-09 00:00:00', '2020-02-10 00:00:00') . PHP_EOL; // No time unit forced, so it picks the most reasonable one.
echo human_friendly_time_string('2020-02-09 00:00:00', '2020-02-10 00:00:00', 'hours') . PHP_EOL; // Force hours.
echo human_friendly_time_string('2020-02-09 00:00:00', '2020-02-10 00:00:00', 'days') . PHP_EOL; // Force days.
echo human_friendly_time_string('2020-02-09 00:00:00', '2020-02-10 00:00:00', 'minutes') . PHP_EOL; // Force minutes.
echo human_friendly_time_string('2020-02-09 00:00:00', '2020-02-10 00:00:00', 'days', 1) . PHP_EOL; // Force days, and force one decimal.

Для вывода (для английского языка sh язык / язык):

1 day
24 hours
1 day
720 minutes
1.0 day

Опять же, я уже сам написал это для Engli sh и немецкого языка, поэтому меня не интересует код PHP, который дублирует это. Мне интересно только, встроен ли он в PHP и, если да, то как его использовать.

1 Ответ

0 голосов
/ 09 февраля 2020

Ну, есть DateTime, у которого есть метод diff, который может вернуть объект DateInterval с соответствующей информацией.

Например:

$date1 = new DateTime('2020-02-08 12:43:18');
$date2 = new DateTime('2020-02-10 00:00:00');

$diff = $date1->diff($date2);

echo
  $diff->days, " days,", $diff->h, " hours,", $diff->i, " minutes,", $diff->s, " seconds.";
// Gives you: 1 days,11 hours,16 minutes,42 seconds.

Для i18n, конечно, есть intl, который имеет основанный на правилах форматер, который также может обрабатывать длительность.

Например:

// Calculate the number of seconds between two dates using DateTime
$date1 = new DateTime('2020-02-08 12:43:18');
$date2 = new DateTime('2020-02-10 00:00:00');

// Most verbosely expressed as...
$diff = $date1->diff($date2);

$seconds = $diff->days * 24 * 60 * 60;
$seconds += $diff->h * 60 * 60;
$seconds += $diff->i * 60;
$seconds += $diff->s;

// Or more simply just
$seconds = $date2->getTimestamp() - $date1->getTimestamp();

// Hand it to the formatter
$fmt = new NumberFormatter('en_US', NumberFormatter::DURATION); // set your locale here
echo $fmt->format($seconds);
// Gives you 35:16:42

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

Вот пример:

$cal1 = IntlCalendar::createInstance('Europe/London', 'de_DE');
$cal2 = IntlCalendar::createInstance('Europe/London', 'de_DE');
$cal1 = $cal1->fromDateTime('2020-02-08 12:43:18');
$cal2 = $cal2->fromDateTime('2020-02-10 00:00:00');
$time = $cal2->getTime();

echo
$cal1->fieldDifference($time, IntlCalendar::FIELD_YEAR), " years, ",
$cal1->fieldDifference($time, IntlCalendar::FIELD_MONTH), " months, ",
$cal1->fieldDifference($time, IntlCalendar::FIELD_DAY_OF_MONTH), " days, ",
$cal1->fieldDifference($time, IntlCalendar::FIELD_HOUR_OF_DAY), " hours, ",
$cal1->fieldDifference($time, IntlCalendar::FIELD_MINUTE), " minutes, ",
$cal1->fieldDifference($time, IntlCalendar::FIELD_SECOND), " seconds.";

// Gives you: 0 years, 0 months, 1 days, 11 hours, 16 minutes, 42 seconds.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...