在过去的 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+0000
Moment 解析以下日期格式作为输入:
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
意大利语ja_JP
日语kz_KZ
哈萨克语lv_LV
拉脱维亚语(拉脱维亚语) nl_NL
荷兰语oc_LNC
Lengadocian pl_PL
波兰语pt_BR
葡萄牙语(巴西) pt_PT
葡萄牙语(葡萄牙) 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+0000
MomentMoment::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');// 结果作为值对象类echo $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');// 结果与值对象 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 蒂诺·埃里希
特此免费授予获得本软件和相关文档文件(“软件”)副本的任何人不受限制地使用本软件,包括但不限于使用、复制、修改、合并的权利、发布、分发、再许可和/或销售软件的副本,并允许向其提供软件的人员这样做,但须满足以下条件:
上述版权声明和本许可声明应包含在本软件的所有副本或主要部分中。
本软件按“原样”提供,不提供任何明示或暗示的保证,包括但不限于适销性、特定用途的适用性和不侵权的保证。在任何情况下,作者或版权持有者均不对因本软件或本软件中的使用或其他交易而产生或与之相关的任何索赔、损害或其他责任负责,无论是合同、侵权行为还是其他行为。软件。