Я стал отцом в течение последних 1,5 лет, и это ясно показывает, что я вовремя объединил PR или продвинул этот пакет дальше. Время здесь является самым большим ограничением. Я был бы рад передать проект тому, у кого больше времени и мотивации продвигать проект вперед. Просто напишите мне сообщение. Ваше здоровье!
_ _ _ __ ___ ___ _ __ ___ ___ _ __ | |_ _ __ | |__ _ __ | '_ ` _ / _ | '_ ` _ / _ '_ | __| | '_ | '_ | '_ | | | | | | (_) | | | | | | __/ | | | |_ _| |_) | | | | |_) | |_| |_| |_|___/|_| |_| |_|___|_| |_|__(_) .__/|_| |_| .__/ |_| |_|
Журнал изменений
Библиотека дат для анализа, манипулирования и форматирования дат с помощью i18n.
PHP 5.3 или новее, поскольку moment.php основан на классе DateTime PHP.
Простая установка через композитор. Все еще не знаете, что такое композитор? Информируйте себя здесь.
composer require fightbulc/moment
$m = новый МоментМомент(); // по умолчанию «сейчас» UTCecho $m->format(); // например, 2012-10-03T10:00:00+0000$m = new MomentMoment('now', 'Europe/Berlin');echo $m->format(); // например, 2012-10-03T12:00:00+0200$m = new MomentMoment('2017-06-06T10:00:00', 'Европа/Берлин');echo $m->format(); // например, 2012-10-03T12:00:00+0200$m = new MomentMoment(1499366585);echo $m->format(); // например 2017-07-06T18:43:05+0000
Moment анализирует следующие форматы дат в качестве входных данных:
const ATOM = 'Ym-dTH:i:sP'; // 2005-08-15T15:52:01+00:00const COOKIE = 'l, dMy H:i:s T'; // понедельник, 15 августа 2005 г. 15:52:01 UTCconst ISO8601 = 'Ym-dTH:i:sO'; // 2005-08-15T15:52:01+0000const RFC822 = 'D, d My y H:i:s O'; // Пн, 15 августа 05 15:52:01 +0000const RFC850 = 'l, dMy H:i:s T'; // понедельник, 15 августа 2005 г. 15:52:01 UTCconst RFC1036 = 'D, d My y H:i:s O'; // Пн, 15 августа 05 15:52:01 +0000const RFC1123 = 'D, d M Y H:i:s O'; // Пн, 15 августа 2005 г. 15:52:01 +0000const RFC2822 = 'D, d M Y H:i:s O'; // Пн, 15 августа 2005 г. 15:52:01 +0000const RSS = 'D, d M Y H:i:s O'; // Пн, 15 августа 2005 г. 15:52:01 +0000const W3C = 'Ym-dTH:i:sP'; // 2005-08-15T15:52:01+00:00// Moment также пытается анализировать даты без часового пояса или без значения секунд NO_TZ_MYSQL = 'Ymd H:i:s'; // 15.08.2005, 15:52:01const NO_TZ_NO_SECS = 'Ymd H:i'; // 15.08.2005, 15:52const NO_TIME = 'Ymd'; // 15 августа 2005 г. // дроби времени ".000" будут автоматически удалены $timeWithFraction = '2016-05-04T10:00:00.000';
Просмотрите папку Locales
, чтобы увидеть все поддерживаемые языки. Локаль по умолчанию — en_GB
.
$m = новый MomentMoment();echo $m->format('[День недели:] l'); // например, день недели: среда // set localeMomentMoment::setLocale('de_DE');$m = new MomentMoment();echo $m->format('[Wochentag:] l'); // например, Wochentag: Mittwoch
Поддерживаемые языки на данный момент:
ar_TN
Арабский (Тунис) ca_ES
Каталанский cs_CZ
Чешский da_DK
Датский de_DE
Немецкий (Германия) en_CA
Английский (Канада) en_GB
Английский (Британский) en_US
Английский (Американский) eo_EO
Эсперанто es_ES
Испанский (Европа) fa_IR
Фарси fi_FI
Финский fr_CA
Французский (Канада) fr_FR
Французский ( Европа) hu_HU
Венгерский id_ID
Индонезийский it_IT
Итальянский ja_JP
Японский kz_KZ
Казахский lv_LV
Латышский (Latviešu) nl_NL
Голландский oc_LNC
Ленгадосский pl_PL
Польский pt_BR
Португальский (Бразилия) pt_PT
Португальский (Португалия) ru_RU
Русский (Базовая версия) sv_SE
Шведский th_TH
Тайский tr_TR
Турецкий uk_UA
Украинский vi_VN
Вьетнамский zh_CN
Китайский zh_TW
Китайский (традиционный)
$m = новый MomentMoment('2012-04-25T03:00:00', 'CET');echo $m->setTimezone('UTC')->format(); // 2012-04-25T01:00:00+0000
MomentMoment::setDefaultTimezone('CET');$m = новый MomentMoment('2016-09-13T14:32:06');echo $m->format(); // 2016-09-13T14:32:06+0100
$m = new MomentMoment('2012-04-25T03:00:00', 'CET');echo $m->format('l, dS F Y / H:i (e)'); // Среда, 25 апреля 2012 г. / 03:00 (Европа/Берлин)
Форматы основаны на функции PHP Date и классе DateTime.
Теперь вы можете внедрить другую обработку формата, передав класс, реализующий FormatsInterface
. В папке test вы можете найти пример реализации всех форматов из moment.js. Спасибо Ашишу за то, что он нашел время сопоставить форматы moment.js
с форматами PHP. Взгляните на тестовый сценарий, чтобы увидеть пример в действии.
Каждый может писать классы формата одинаково. Это легко и масштабируемо.
// получаем класс желаемых форматов // создаем момент $m = новый MomentMoment('2012-04-25T03:00:00', 'CET');// формат с определением moment.jssecho $m->format('LLLL ', новый MomentCustomFormatsMomentJs()); // Среда, 25 апреля 2012 г., 3:00
Custom formats
также могут быть частью каждого Locale
. Если он еще не существует для вашего региона, добавьте его. См. пример для французской локали.
Просто оберните весь текст в []
и все символы будут автоматически экранированы.
$m = new MomentMoment('2012-04-25T03:00:00', 'CET');echo $m->format('[Мы в месяце:] F'); // Мы в месяце: апрель
Внутреннее вычисление порядкового номера PHP кажется ошибочным. Я добавил быстрое исправление для решения этой проблемы.
В следующем примере выводится неделя года заданной даты. Он должен напечатать 22nd
:
// внутренняя функцияdate('WS', mktime(12, 22, 0, 5, 27, 2014)); // 22-е // moment.php$m = new MomentMoment('2014-05-27T12:22:00', 'CET');$m->format('WS'); // 22-е место
$m = new MomentMoment('2012-05-15T12:30:00', 'CET');echo $m->addHours(2)->format(); // 2012-05-15T14:30:00+0200$m = new MomentMoment('2012-05-15T12:30:00', 'CET');echo $m->subtractDays(7)->subtractMinutes(15) )->формат(); // 2012-05-08T12:15:00+0200$m = новый MomentMoment('@1401443979', 'CET'); // unix timeecho $m->subtractDays(7)->subtractMinutes(15)->format(); // 2014-05-23T09:44:39+0000
Иногда полезно взять данный момент и поработать с ним, не меняя начало координат. Для этого используйте cloning()
.
$m = new MomentMoment('2012-05-15T12:30:00', 'CET'); $c = $m->cloning()->addDays(1);echo $m->getDay(); // 15echo $c->getDay(); // 16
Альтернативно вы можете включить неизменяемый режим в источнике.
$m = новый MomentMoment('2012-05-15T12:30:00', 'CET', true);$c = $m->addDays(1);echo $m->getDay(); // 15echo $c->getDay(); // 16// Вы также можете изменить неизменяемый режим после создания: $m->setImmutableMode(false)->subtractDays(1);echo $m->getDay(); // 14
Неизменяемый режим заставляет все методы модификации неявно вызывать cloning()
перед применением своих модификаций.
Добавлять | Вычесть |
---|---|
addSeconds($s) | вычестьсекунды ($ с) |
addMinutes ($ я) | вычестьМинуты ($i) |
добавитьчасы($ч) | вычестьчасы($ч) |
addDays($d) | вычестьДни($d) |
addWeeks($w) | вычестьНедели($w) |
addMonths($м) | вычестьмесяцы($м) |
добавитьГоды($y) | вычестьГод($y) |
Сеттер | Геттер |
---|---|
setSecond($s) | getSecond() |
setMinute($m) | getMinute() |
setHour($ч) | getHour() |
setDay($d) | getDay() |
setMonth($м) | getMonth() |
УстановитьГод($y) | получить год() |
-- | getQuarter() |
$m = new MomentMoment('2013-02-01T07:00:00');$momentFromVo = $m->fromNow();// или с определенного момента$m = new MomentMoment('2013-02-01T07: 00:00');$momentFromVo = $m->from('2011-09-25T10:00:00');// результат приходит в виде объекта значения classecho $momentFromVo->getDirection() // "future"echo $momentFromVo->getSeconds() // -42411600echo $momentFromVo->getMinutes() // -706860echo $momentFromVo->getHours() // -11781echo $momentFromVo->getDays() // -490.88echo $momentFromVo->getWeeks() // -70.13echo $momentFromVo->getMonths() // -17.53echo $momentFromVo- >getYears() // -1.42echo $momentFromVo->getRelative() // через год
Иногда полезно получить границы периода для определенной даты. Например, если сегодня среда, и мне нужны даты начала/окончания сегодняшней недели. Допустимые периоды: week
, month
и quarter
.
$m = new MomentMoment('2013-10-23T10:00:00');$momentPeriodVo = $m->getPeriod('week');// результаты приходят вместе с классом объекта значения $momentPeriodVo->getStartDate( ) ->format('Ymd'); // 2013-10-21echo $momentPeriodVo->getEndDate() ->format('Ymd'); // 2013-10-27echo $momentPeriodVo->getRefDate() ->format('Ymd'); // 2013-10-23echo $momentPeriodVo->getInterval(); // 43 = неделя года
Та же процедура для месячных и квартальных периодов:
$momentPeriodVo = $m->getPeriod('месяц');$momentPeriodVo = $m->getPeriod('квартал');
Календарное время отображает время относительно now
, но немного иначе, чем Moment::fromNow()
. Moment::calendar()
форматирует дату с помощью разных строк в зависимости от того, насколько близка дата к сегодняшнему дню.
(new MomentMoment('2014-03-30T16:58:00', 'CET'))->subtractDays(6)->calendar(); // прошлая неделя(new MomentMoment('2014-03-30T16:58:00', 'CET'))->subtractDays(1)->calendar(); // вчера(новый MomentMoment('2014-03-30T16:58:00', 'CET'))->calendar(); // сегодня(новый MomentMoment('2014-03-30T16:58:00', 'CET'))->addDays(1)->calendar(); // завтра(новый MomentMoment('2014-03-30T16:58:00', 'CET'))->addDays(3)->calendar(); // на следующей неделе(new MomentMoment('2014-03-30T16:58:00', 'CET'))->addDays(10)->calendar(); // все остальное
Время | Отображать |
---|---|
На прошлой неделе | В прошлый понедельник в 15:54 |
Накануне | Вчера в 15:54 |
В тот же день | Сегодня в 15:54 |
На следующий день | Завтра в 15:54 |
На следующей неделе | Среда в 15:54 |
Все остальное | 09.04.2014 |
Примечание. Используйте $moment->calendar(false)
чтобы исключить время at 00:00
.
Тот же процесс, что и для moment.js: изменяет исходный момент, устанавливая его в начало/конец единицы времени.
$m = новый MomentMoment('20140515T10:15:23', 'CET');$m->startOf('год'); // установлено на 1 января 00:00 этого года$m->startOf('quarter'); // устанавливаем начало текущего квартала, 1-й день месяца, 00:00$m->startOf('month'); // устанавливаем первое число этого месяца, 00:00$m->startOf('week'); // устанавливаем первый день этой недели, 00:00$m->startOf('day'); // устанавливаем сегодня 00:00$m->startOf('hour'); // устанавливаем сейчас, но с 0 минутами, 0 секундами$m->startOf('минута'); // устанавливаем сейчас, но с 0 секундами $m->endOf('year'); // установлено на 31 декабря, 23:59 этого года$m->endOf('quarter'); // устанавливаем конец текущего квартала, последний день месяца, 23:59$m->endOf('month'); // устанавливаем последнее число этого месяца, 23:59$m->endOf('week'); // устанавливаем последний день этой недели, 23:59$m->endOf('day'); // установлено сегодня на 23:59$m->endOf('hour'); // установлено сейчас, но с 59 минутами, 59 секундами$m->endOf('минута'); // установлено сейчас, но с 59 секундами
Примечание. Я проигнорировал период second
, поскольку мы не имеем дело с миллисекундами.
Для одного из моих клиентов мне нужно было получить моменты по выбранным дням недели. Задача была: дайте мне даты Tuesdays
и Thursdays
на ближайшие три недели. Поэтому я добавил небольшой обработчик, который делает именно это. В результате вы получите массив, заполненный Moment Objects
.
// 1 - 7 = Пн - Вс$weekdayNumbers = [2, // вторник4, // четверг];$m = new MomentMoment();$dates = $m->getMomentsByWeekdays($weekdayNumbers, 3);// $ даты = [Момент, Момент, Момент ...]
Теперь вы можете просмотреть результат и отформатировать его в раскрывающемся поле или там, где он вам может понадобиться.
Попробуйте портировать полезные методы из moment.js.
Добавьте модульные тесты
добавлен:
поддержка PHP 8.2 #218
поддержка PHP 8.3 #227
зафиксированный:
Французский язык
Канадские тесты
добавлен:
Эсперанто локаль
Казахский язык
зафиксированный:
DateTime::createFromFormat совпадение подписи
добавлен:
язык фарси
добавлен:
проверка кода в соответствии с рабочими процессами действий GH
Канадский язык для английского/французского языка
зафиксированный:
слиться с парочкой пиарщиков (спасибо!)
добавлен:
Завершить языковой стандарт
зафиксированный:
Шведский язык
обновлен итальянский язык
добавлен:
пользовательские форматы для en_US
флаг для загрузки аналогичной локали
исправлена проблема с подсказками
зафиксированный:
отсутствует формат относительного времени
разрешить 9-значный unixtime
исправлен RFC2822 как действительный формат
фиксированное относительное время
добавлен норвежский язык
исправления и дополнения локали (см. коммиты от 22.11.2018)
зафиксированный:
Окситанский регион
зафиксированный:
Проблема с русской локалью
добавлен:
Португальский (pt_PT)
зафиксированный:
Порядок будних дней на венгерском языке
добавлен:
разрешить инициализацию Moment с меткой времени unix без начала @
зафиксированный:
Исправить формат «LLL» в пользовательских форматах.
зафиксированный:
удален только синтаксис php5.4+
зафиксированный:
Датские названия дней и месяцев в правильном регистре
Французский язык
PHPДокументы
добавлен:
константы для NO_TZ_MYSQL
, NO_TZ_NO_SECS
и NO_TIME
при анализе дат
добавлен:
Голландский пользовательский формат
зафиксированный:
Русская локаль
добавлен:
Турецкий язык
зафиксированный:
Ленгадокийский регион
зафиксированный:
PHP7.1 setTime требует $microseconds
добавлен:
Украинская локаль
добавлен:
Венгерский регион
зафиксированный:
Ленгадокийский регион
добавлен:
Вьетнамский язык
Ленгадокийский регион
добавлен:
Изменить часовой пояс по умолчанию
зафиксированный:
ФорматыДокументация по интерфейсу
добавлен:
арабский язык
Пользовательский формат на уровне локали
зафиксированный:
Русская локаль
добавлен:
тесты русской локали
зафиксированный:
Польский язык
Расчет секунд
зафиксированный:
Русский: больше исправлений относительного времени
зафиксированный:
Относительное время русской локали: обработка дня
зафиксированный:
отсутствует неизменяемая обработка
зафиксированный:
Улучшена польская локаль (добавлен Nominativ).
зафиксированный:
Китайская локаль
добавлены поддерживаемые форматы в README
зафиксированный:
Тайский язык
добавлен:
Каталонский язык
зафиксированный:
Тест польской локали
добавлен:
Русская локаль
зафиксированный:
Тест польской локали
добавлен:
Неизменяемый режим
зафиксированный:
Польский язык
добавлен:
Польский язык
добавлен:
Индонезийский язык
добавлен:
Японский язык
зафиксированный:
опечатка в голландской локали
добавлен:
Голландский язык
добавлен:
Шведский язык
добавлен:
Датский язык
зафиксированный:
фиксированный начальный/конечный день недели для румынской локали
зафиксированный:
добавление символа-разделителя в итальянский язык
зафиксированный:
передача нового экземпляра для startOf/endOf за неделю, месяц, квартал
добавлен:
язык чешский
добавлен:
локаль calendar
получает в качестве закрытия следующую function(Moment $m) {}
Локаль relativeTime
получает в качестве замыкания следующие параметры function($count, $direction, Moment $m) {}
добавлен:
исправлена передача замыканий на локаль (календарь, относительное время)
установите правильную информацию о немецкой локали
добавлен:
исправлены строки тайского языка
добавлен:
региональный традиционный китайский
добавлен:
язык китайский
порядковый форматировщик теперь получает token
, например, токен в dS
равен d
исправлено: проблема с порядковым номером в английском языке для чисел от 11 до 13.
добавлено: локаль итальянский
исправлено: проблема с английским порядковым номером
добавлено: локаль португальский
зафиксированный:
В локали отображается неправильное название месяца (#34).
Изменен порядок дней недели в файлах локали.
добавлен:
getWeekdayNameLong()
getWeekdayNameShort()
getMonthNameLong()
getMonthNameShort()
добавлен:
Язык: Тайский
добавлен:
getMonths()
получитьГоды()
getRelative()
Языковой стандарт
МоментОтВо:
зафиксированный:
getSeconds() теперь также показывает направление
МоментОтВо:
зафиксированный:
проблема с часовым поясом, которая возникала только для дат unixtime
другой:
направление возвращается сейчас: «будущее» (-) / «прошлое» (+)
значения времени теперь преобразуются в числа с плавающей запятой
МоментОтВо:
зафиксированный:
нераспознанный часовой пояс при создании момента
добавлен:
getMomentsByWeekdays()
getWeekday()
getWeekOfYear()
другой:
экранированный текст
добавлен:
например, [Hello World]
автоматически преобразуется в Hello World
например, WS
для 21-й недели года теперь показывает правильную 21th
и т. д.
получить период для данного квартала в данном году
week
= неделя года
month
= месяц года
quarter
= квартал года
создать новый изменяемый момент на основе данного экземпляра
startOf и endOf, реализованные в moment.js
получить квартальный период заданной даты
установитьДень()
getDay()
setMonth()
getMonth()
УстановитьГод()
получить год()
getQuarter()
setSecond()
getSecond()
установитьМинуту()
getMinute()
setHour()
getHour()
добавлено клонирование()
добавлен getInterval()
в MomentPeriodVo
для указания интервала данного периода.
добавлен статический класс MomentHelper
исправлено внутреннее вычисление порядкового номера PHP (также в сочетании с форматированием moment.js)
теперь вы можете экранировать текст, обернув его в []
удаленный:
добавлять()
вычесть()
добавлен:
формат календаря, реализованный в moment.js
зафиксированный:
несовместимость с PHP 5.3
добавлен:
проверка дат в формате YYYY-mm-dd
и YYYY-mm-ddTHH:ii:ss
выдает MomentException в недопустимые даты
Выброс исключения как MomentException
Проверка даты при создании экземпляра:
добавитьСекунды()
добавитьМинуты()
addHours()
добавитьДни()
addWeeks()
добавитьМесяцы()
добавитьГоды()
вычестьСекунды()
вычестьМинуты()
вычесть часы()
вычестьДни()
вычесть недели()
вычестьМесяцы()
вычестьГод()
устарел:
добавлять()
вычесть()
Сопровождающие этого проекта предлагают следовать руководству по вкладу.
Moment.php распространяется свободно в соответствии с условиями лицензии MIT.
Copyright (c) 2017 Тино Эрих
Настоящим бесплатно любому лицу, получившему копию этого программного обеспечения и связанных с ним файлов документации («Программное обеспечение»), предоставляется разрешение на работу с Программным обеспечением без ограничений, включая, помимо прочего, права на использование, копирование, изменение, объединение. публиковать, распространять, сублицензировать и/или продавать копии Программного обеспечения, а также разрешать лицам, которым предоставлено Программное обеспечение, делать это при соблюдении следующих условий:
Вышеупомянутое уведомление об авторских правах и настоящее уведомление о разрешении должны быть включены во все копии или существенные части Программного обеспечения.
ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ПРЕДОСТАВЛЯЕТСЯ «КАК ЕСТЬ», БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ, ЯВНЫХ ИЛИ ПОДРАЗУМЕВАЕМЫХ, ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИВАЯСЬ, ГАРАНТИЯМИ ТОВАРНОЙ ЦЕННОСТИ, ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЕННОЙ ЦЕЛИ И НЕНАРУШЕНИЯ ПРАВ. НИ ПРИ КАКИХ ОБСТОЯТЕЛЬСТВАХ АВТОРЫ ИЛИ ОБЛАДАТЕЛИ АВТОРСКИХ ПРАВ НЕ НЕСУТ ОТВЕТСТВЕННОСТИ ЗА ЛЮБЫЕ ПРЕТЕНЗИИ, УБЫТКИ ИЛИ ДРУГУЮ ОТВЕТСТВЕННОСТЬ, БУДЬ В ДЕЙСТВИЯХ ПО КОНТРАКТУ, ПРАВОНАРУШЕНИЮ ИЛИ ДРУГИМ ОБРАЗОМ, ВОЗНИКАЮЩИЕ ОТ, ИЗ ИЛИ В СВЯЗИ С ПРОГРАММНЫМ ОБЕСПЕЧЕНИЕМ ИЛИ ИСПОЛЬЗОВАНИЕМ ИЛИ ДРУГИМИ СДЕЛКАМИ, ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ.