使用 date-fns 版本 2.x 时,如何将日期时间格式化为 am/pm,不带句点?
How do you format a datetime to am/pm, without periods, when using date-fns version 2.x?
版本2.x的优秀日期包date-fns
只有这些内置的am/pm格式。
如何格式化没有句号的小写 am/pm?
-- 对于早于 2.23.0 的 datefns 版本 --
快速解决
使用aaaaa'm'
:
format(new Date(), "YYYY-MM-DD hh:mm aaaaa'm'")
解释: @GollyJer 找到了一个非常聪明的方法来解决这个限制。我们可以根据 the documentation 使用 aaaaa
产生 a
(对于上午)或 p
(对于下午)。然后我们在它后面加上转义字符 m
,即 'm'
,结果是 am
或 pm
.
注意:如果您允许任何类型的区域设置切换,这可能会导致错误输出,因为 AM 和 PM 可能因语言而异。
其他方式
尽管如此,根据文档和源代码审查,对于这些版本,没有 native¹ 方法来执行此操作,因为格式取决于语言环境配置,如源代码 (_lib/format/formatters/index.js
):
// AM or PM
a: function(date, token, localize) {
var hours = date.getUTCHours()
var dayPeriodEnumValue = hours / 12 >= 1 ? 'pm' : 'am'
switch (token) {
case 'a':
case 'aa':
case 'aaa':
return localize.dayPeriod(dayPeriodEnumValue, {
width: 'abbreviated',
context: 'formatting'
})
// ...
1: 本机,我的意思是一个简单的本机 API 格式化程序。
你可以add a new locale to customize the strings though. This would imply changing this specific part (based on locale/en-US/_lib/localize/index.js
):
var formattingDayPeriodValues = {
// ...
abbreviated: {
am: 'AM',
pm: 'PM',
// ...
}
// ...
}
遗憾的是,这个新版本没有直接自定义默认语言环境的方法,甚至没有简单的方法来应用猴子补丁。创建一个新的语言环境一点也不优雅,在调用 format
之后手动将 a.m.
替换为 am
也不优雅。
版本 1.x.x 和 2.0.0 (alpha/beta)
对于这些版本,只需使用 a
格式。示例:
console.log(dateFns.format(new Date(), 'YYYY-MM-DD hh:mm a'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/date-fns/1.30.1/date_fns.min.js"></script>
<!-- or: https://cdnjs.cloudflare.com/ajax/libs/date-fns/2.0.0-alpha0/date_fns.min.js -->
您可以自己检查 in the source code 它的工作方式:
var meridiemLowercase = [
'am',
'pm'
];
var formatters = {
// ...
'a': function (date) {
return date.getHours() / 12 >= 1 ? meridiemLowercase[1] : meridiemLowercase[0];
},
// ...
}
您现在可以对这种情况使用 aaa
模式 (v.2.23.0)
。
版本2.x的优秀日期包date-fns
只有这些内置的am/pm格式。
如何格式化没有句号的小写 am/pm?
-- 对于早于 2.23.0 的 datefns 版本 --
快速解决
使用aaaaa'm'
:
format(new Date(), "YYYY-MM-DD hh:mm aaaaa'm'")
解释: @GollyJer 找到了一个非常聪明的方法来解决这个限制。我们可以根据 the documentation 使用 aaaaa
产生 a
(对于上午)或 p
(对于下午)。然后我们在它后面加上转义字符 m
,即 'm'
,结果是 am
或 pm
.
注意:如果您允许任何类型的区域设置切换,这可能会导致错误输出,因为 AM 和 PM 可能因语言而异。
其他方式
尽管如此,根据文档和源代码审查,对于这些版本,没有 native¹ 方法来执行此操作,因为格式取决于语言环境配置,如源代码 (_lib/format/formatters/index.js
):
// AM or PM
a: function(date, token, localize) {
var hours = date.getUTCHours()
var dayPeriodEnumValue = hours / 12 >= 1 ? 'pm' : 'am'
switch (token) {
case 'a':
case 'aa':
case 'aaa':
return localize.dayPeriod(dayPeriodEnumValue, {
width: 'abbreviated',
context: 'formatting'
})
// ...
1: 本机,我的意思是一个简单的本机 API 格式化程序。
你可以add a new locale to customize the strings though. This would imply changing this specific part (based on locale/en-US/_lib/localize/index.js
):
var formattingDayPeriodValues = {
// ...
abbreviated: {
am: 'AM',
pm: 'PM',
// ...
}
// ...
}
遗憾的是,这个新版本没有直接自定义默认语言环境的方法,甚至没有简单的方法来应用猴子补丁。创建一个新的语言环境一点也不优雅,在调用 format
之后手动将 a.m.
替换为 am
也不优雅。
版本 1.x.x 和 2.0.0 (alpha/beta)
对于这些版本,只需使用 a
格式。示例:
console.log(dateFns.format(new Date(), 'YYYY-MM-DD hh:mm a'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/date-fns/1.30.1/date_fns.min.js"></script>
<!-- or: https://cdnjs.cloudflare.com/ajax/libs/date-fns/2.0.0-alpha0/date_fns.min.js -->
您可以自己检查 in the source code 它的工作方式:
var meridiemLowercase = [
'am',
'pm'
];
var formatters = {
// ...
'a': function (date) {
return date.getHours() / 12 >= 1 ? meridiemLowercase[1] : meridiemLowercase[0];
},
// ...
}
您现在可以对这种情况使用 aaa
模式 (v.2.23.0)
。