在過去的 1.5 年裡,我已經成為一名父親,這清楚地表明我準時合併 PR 或進一步推動這項計劃。時間是這裡最大的限制。我很樂意將專案交給有更多時間和動力推動專案前進的人。請給我留言。乾杯!
_ _
_ __ ___ ___ _ __ ___ ___ _ __ | |_ _ __ | |__ _ __
| '_ ` _ / _ | '_ ` _ / _ '_ | __| | '_ | '_ | '_
| | | | | | (_) | | | | | | __/ | | | |_ _| |_) | | | | |_) |
|_| |_| |_|___/|_| |_| |_|___|_| |_|__(_) .__/|_| |_| .__/
|_| |_|變更日誌
用於使用 i18n 解析、操作和格式化日期的日期庫。
PHP 5.3 或更高版本,因為 moment.php 是基於 php 的 DateTime 類別。
透過作曲家輕鬆安裝。仍然不知道作曲家是誰?在這裡通知自己。
composer require fightbulc/moment
$m = 新的 MomentMoment(); // 預設為“now”UTCecho $m->format(); // 例如 2012-10-03T10:00:00+0000$m = new MomentMoment('now', '歐洲/柏林');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+0000Moment 解析以下日期格式作為輸入:
const ATOM = 'Ym-dTH:i:sP'; // 2005-08-15T15:52:01+00:00const COOKIE = 'l, dMy H:i:s T'; // 2005 年 8 月 15 日星期一 15:52:01 UTCconst ISO8601 = 'Ym-dTH:i:sO'; // 2005-08-15T15:52:01+0000const RFC822 = 'D, d M y H:i:s O'; // 2005 年 8 月 15 日星期一 15:52:01 +0000const RFC850 = 'l, dMy H:i:s T'; // 2005 年 8 月 15 日星期一 15:52:01 UTCconst RFC1036 = 'D, d M y H:i:s O'; // 2005 年 8 月 15 日星期一 15:52:01 +0000const RFC1123 = 'D, d M Y H:i:s O'; // 2005 年 8 月 15 日星期一 15:52:01 +0000const RFC2822 = 'D, d M Y H:i:s O'; // 2005 年 8 月 15 日星期一 15:52:01 +0000const RSS = 'D, d M Y H:i:s O'; // 2005 年 8 月 15 日星期一 15:52:01 +0000const W3C = 'Ym-dTH:i:sP'; // 2005-08-15T15:52:01+00:00// Moment 也試著解析沒有時區或沒有秒的日期 const NO_TZ_MYSQL = 'Ymd H:i:s'; // 2005-08-15 15:52:01const NO_TZ_NO_SECS = 'Ymd H:i'; // 2005-08-15 15:52const NO_TIME = 'Ymd'; // 2005-08-15// 時間分數「.000」將會自動刪除$timeWithFraction = '2016-05-04T10:00:00.000';
查看Locales資料夾以查看所有支援的語言。預設區域設定是en_GB 。
$m = new MomentMoment();echo $m->format('[Weekday:] l'); // 例如工作日:星期三 // 設定德語 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 pt_BR ja_JP pt_PT kz_KZ哈薩克語lv_LV拉脫維亞語(拉脫維亞語) nl_NL荷蘭語oc_LNC Lengadocian pl_PL (巴西語)語(葡萄牙) ru_RU俄語(基本版) sv_SE瑞典語th_TH泰語tr_TR土耳其語uk_UA烏克蘭語vi_VN越南語zh_CN中文zh_TW中文(繁體)
$m = new MomentMoment('2012-04-25T03:00:00', 'CET');echo $m->setTimezone('UTC')->format(); // 2012-04-25T01:00:00+0000MomentMoment::setDefaultTimezone('CET');$m = new 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)'); // 2012 年 4 月 25 日星期三 / 03:00(歐洲/柏林)格式基於 PHP 的 Date 函數和 DateTime 類別。
現在,您可以透過傳遞實作FormatsInterface的類別來注入不同的格式處理。您可以在 test 資料夾中找到一個範例,用於實作 moment.js 中的所有格式。感謝 Ashish 花時間將moment.js格式與 PHP 格式進行配對。查看測試腳本以了解範例的實際效果。
每個人都可以用同樣的方式寫格式類別。它簡單且可擴展。
// 取得所需的格式class// 建立一個moment$m = new MomentMoment('2012-04-25T03:00:00', 'CET');// 使用moment.js 定義的格式echo $m-> format('LLLL ', new MomentCustomFormatsMomentJs()); // 2012 年 4 月 25 日星期三凌晨 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 = new 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 = new 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() 。
| 添加 | 減去 |
|---|---|
| 加秒($s) | 減去秒($s) |
| 加分鐘數($i) | 減去分鐘($i) |
| 新增時間($h) | 減去小時($h) |
| 加天數($d) | 減去天數($d) |
| 加週數($w) | 減去週($w) |
| 新增月份(百萬美元) | 減去月份(百萬美元) |
| 新增年份($y) | 減去年份($y) |
| 賽特 | 吸氣劑 |
|---|---|
| 設定第二個($s) | 取得第二個() |
| 設定分鐘($m) | 取得分鐘() |
| 設定時間($h) | 取得小時() |
| 設定日期($d) | 取得日期() |
| 設定月(百萬美元) | 取得月份() |
| 設定年份($y) | 取得年份() |
| -- | 取得季度() |
$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.8echoo> // -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');// 結果與值物件 classecho $momentPeriodVo->getStartDate( )
->格式('Ymd'); // 2013-10-21echo $momentPeriodVo->getEndDate()
->格式('Ymd'); // 2013-10-27echo $momentPeriodVo->getRefDate()
->格式('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(); // 昨天(new MomentMoment('2014-03-30T16:58:00', 'CET'))->calendar(); // 今天(new MomentMoment('2014-03-30T16:58:00', 'CET'))->addDays(1)->calendar(); // 明天(new 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 |
| 其他一切 | 2014年4月9日 |
注意:使用$moment->calendar(false)省略at 00:00時間。
與 moment.js 的過程相同:透過將原始時刻設定為時間單位的開始/結束來改變原始時刻。
$m = new MomentMoment('20140515T10:15:23', 'CET');$m->startOf('年份'); // 設定為今年 1 月 1 日 00:00$m->startOf('quarter'); // 設定為目前季度的開始,每月的第一天,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'); // 設定為今年 12 月 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 操作工作流程
加拿大英語/法語語言環境
固定的:
與幾個 PR 合併(謝謝!)
額外:
完成語言環境
固定的:
瑞典語環境
更新了義大利語語言環境
額外:
en_US 的自訂格式
用於載入類似語言環境的標誌
修復了類型提示問題
固定的:
缺少相對時間格式
允許 9 位元 unixtime
將 RFC2822 修復為有效格式
固定相對時間
新增了挪威語言環境
修復和區域設定新增(請參閱 2018 年 11 月 22 日的提交)
固定的:
奧克語語言環境
固定的:
俄語語言環境問題
額外:
葡萄牙語 (pt_PT)
固定的:
匈牙利語言環境工作日順序
額外:
允許使用 unix 時間戳初始化 Moment,無需前導 @
固定的:
修正自訂格式中“LLL”的格式
固定的:
刪除了僅限 php5.4+ 的語法
固定的:
丹麥語日期和月份名稱的正確大小寫
法語語言環境
PHP文檔
額外:
解析日期時NO_TZ_MYSQL 、 NO_TZ_NO_SECS和NO_TIME的常數
額外:
荷蘭客製化格式
固定的:
俄語語言環境
額外:
土耳其語言環境
固定的:
倫加多西亞語言環境
固定的:
PHP7.1 setTime 需要$microseconds
額外:
烏克蘭語言環境
額外:
匈牙利語言環境
固定的:
倫加多西亞語言環境
額外:
越南語言環境
倫加多西亞語言環境
額外:
更改預設時區
固定的:
格式介面文檔
額外:
阿拉伯語語言環境
區域設定等級的自訂格式
固定的:
俄語語言環境
額外:
俄語語言環境測試
固定的:
波蘭語言環境
秒的計算
固定的:
俄語:更多相對時間修復
固定的:
俄語語言環境相對時間:日處理
固定的:
缺少不可變處理
固定的:
改進了波蘭語語言環境(增加了Nominativ)
固定的:
中文語言環境
在自述文件中加入了可接受的格式
固定的:
泰國語言環境
額外:
加泰隆尼亞語語言環境
固定的:
波蘭語語言環境測試
額外:
俄語語言環境
固定的:
波蘭語語言環境測試
額外:
不可變模式
固定的:
波蘭語言環境
額外:
波蘭語言環境
額外:
印尼語言環境
額外:
日語語言環境
固定的:
荷蘭語語言環境中的拼字錯誤
額外:
荷蘭語語言環境
額外:
瑞典語環境
額外:
丹麥語言環境
固定的:
羅馬尼亞語言環境的固定開始/結束工作日
固定的:
在義大利語語言環境中新增分隔符
固定的:
傳回週、月、季的 startOf/endOf 的新實例
額外:
語言環境 捷克語
額外:
calendar環境接收以下 params function(Moment $m) {}作為閉包
relativeTime locale 接收以下 params function($count, $direction, Moment $m) {}作為閉包
額外:
修正了向區域設定(日曆、相對時間)傳遞閉包的問題
設定正確的德語區域設定訊息
額外:
修復了泰語區域設定字串
額外:
語言環境 繁體中文
額外:
語言環境 中文
序數格式化程式現在接收token ,例如dS中的令牌是d
已修正:11 - 13 之間數字的英文序數問題
新增:語言環境義大利語
修正:英文序數問題
新增:語言環境葡萄牙語
固定的:
區域設定顯示錯誤的月份名稱 (#34)
更改了區域設定檔中工作日的順序
額外:
getWeekdayNameLong()
getWeekdayNameShort()
getMonthNameLong()
getMonthNameShort()
額外:
地區: 泰語
額外:
取得月份()
getYears()
取得相對值()
語言環境
來自 Vo 的時刻:
固定的:
getSeconds() 現在也顯示方向
來自 Vo 的時刻:
固定的:
僅針對 unixtime 日期發生的時區問題
其他:
方向現在返回:「未來」(-)/「過去」(+)
時間值現在類型轉換為浮點數
來自 Vo 的時刻:
固定的:
建置 Moment 時無法辨識時區
額外:
getMomentsByWeekdays()
取得工作日()
getWeekOfYear()
其他:
轉義文本
額外:
例如[Hello World]將自動轉換為Hello World
例如,一年中第 21 週的WS現在顯示正確的21th等。
取得給定年份中給定季度的期間
week = 一年中的第幾週
month = 一年中的月份
quarter = 一年中的季度
根據給定實例創建一個新的可變時刻
startOf 和 endOf 由 moment.js 實現
取得給定日期的季度週期
設定日期()
取得日期()
設定月份()
取得月份()
設定年份()
取得年份()
取得季度()
設定第二個()
取得第二個()
設定分鐘()
取得分鐘()
設定時間()
取得小時()
添加克隆()
MomentPeriodVo加入getInterval()來指示給定時間段的間隔
新增了靜態類別MomentHelper
修正了 PHP 的內部序數計算(也與 moment.js 格式結合使用)
現在您可以透過將文本包裹在[]中來轉義文本
刪除:
添加()
減去()
額外:
由 moment.js 實作的日曆格式
固定的:
與 PHP 5.3 不相容
額外:
測試日期格式YYYY-mm-dd和YYYY-mm-ddTHH:ii:ss
在無效日期上拋出 MomentException
異常拋出為MomentException
實例化時的日期驗證:
加秒數()
加入分鐘數()
新增時間()
加天數()
添加週()
加入月份()
新增年份()
減去秒()
減去分鐘()
減去小時()
減去天數()
減去週()
減去月份()
減去年份()
已棄用:
添加()
減去()
該專案的維護者建議遵循貢獻指南。
Moment.php 可自由依 MIT 授權條款分發。
版權所有 (c) 2017 蒂諾·埃里希
特此免費授予任何獲得本軟體和相關文件文件(「軟體」)副本的人不受限制地使用本軟體,包括但不限於使用、複製、修改、合併的權利、發布、分發、再授權和/或銷售軟體的副本,並允許向其提供軟體的人員這樣做,但須滿足以下條件:
上述版權聲明和本授權聲明應包含在本軟體的所有副本或主要部分中。
本軟體以「現況」提供,不提供任何明示或暗示的保證,包括但不限於適銷性、特定用途的適用性和不侵權的保證。 IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE軟體.