使用 date-fns 2.x 版时,如何将日期时间格式化为 am/pm,没有句点?

Gol*_*Jer 5 javascript date-fns

优秀日期包的 2.x 版date-fns只有这些内置的 am/pm 格式。

date-fns am pm 格式

如何在没有句点的情况下格式化小写的 am/pm?

Bru*_*ins 10

您现在可以使用aaa该案例的模式(v.2.23.0)

在此输入图像描述

来源: https: //date-fns.org/v2.23.0/docs/format


Tor*_*bio 8

版本 2.xx(发布)

快速解决方案

使用aaaaa'm'

format(new Date(), "YYYY-MM-DD hh:mm aaaaa'm'")
Run Code Online (Sandbox Code Playgroud)

说明: @GollyJer 找到了一种非常聪明的方法来解决此限制。根据文档,我们可以使用aaaaayield a(for AM) 或p(for PM) 。然后我们只需要跟在它后面的转义字符,即产生or 。m'm'ampm

注意:如果您允许任何类型的区域设置切换,这可能会导致错误的输出,因为 AM 和 PM 可能因语言而异。

其他方法

尽管如此,对于这些版本,根据文档和源代码审查,没有本机¹ 的方法来执行此操作,因为格式取决于源代码 ( _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'
  })
  // ...
Run Code Online (Sandbox Code Playgroud)

1:通过原生,我的意思是一个简单的原生 API 格式化程序。

不过,您可以添加新的语言环境来自定义字符串。这意味着更改此特定部分(基于locale/en-US/_lib/localize/index.js):

var formattingDayPeriodValues = {
    // ...
    abbreviated: {
        am: 'AM',
        pm: 'PM',
        // ...
    }
    // ...
}
Run Code Online (Sandbox Code Playgroud)

遗憾的是,这个新版本没有自定义默认语言环境的简单方法,甚至没有简单的方法来应用猴子补丁。创建一个新的语言环境是不是在所有优雅的和更换a.m.am通话后手动format不是非此即彼。

版本 1.xx 和 2.0.0 (alpha/beta)

对于这些版本,只需使用a格式。例子:

format(new Date(), "YYYY-MM-DD hh:mm aaaaa'm'")
Run Code Online (Sandbox Code Playgroud)
// 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'
  })
  // ...
Run Code Online (Sandbox Code Playgroud)

您可以在源代码中自行检查其工作方式:

var meridiemLowercase = [
    'am',
    'pm'
];

var formatters = {
    // ...
    'a': function (date) {
        return date.getHours() / 12 >= 1 ? meridiemLowercase[1] : meridiemLowercase[0];
    },
    // ...
}
Run Code Online (Sandbox Code Playgroud)