Moment: 获取仅包含月份和日期的本地化格式

创建于 2016-08-01  ·  20评论  ·  资料来源: moment/moment

我查看了语言环境源文件,找不到仅在没有年份信息的情况下显示月份和日期的格式。 来自 locale/zh-cn.js 文件的一个示例

longDateFormat : {
    LT : 'Ah点mm分',
    LTS : 'Ah点m分s秒',
    L : 'YYYY-MM-DD',
    LL : 'YYYY年MMMD日',
    LLL : 'YYYY年MMMD日Ah点mm分',
    LLLL : 'YYYY年MMMD日ddddAh点mm分',
    l : 'YYYY-MM-DD',
    ll : 'YYYY年MMMD日',
    lll : 'YYYY年MMMD日Ah点mm分',
    llll : 'YYYY年MMMD日ddddAh点mm分'
},

列表格式都有年份。 你能支持像 LM 或 lm: 'MMMD日' 这样的格式吗?

请指教。

Enhancement

最有用的评论

我们使用这个正则表达式来克服这个问题

moment().format('L').replace(new RegExp('[^\.]?' + moment().format('YYYY') + '.?'), '')

它执行以下转换
05/04/2017 -> 05/04(例如美国、英国)
2017-04-03 -> 04-03(例如瑞典)
8.7.2017 -> 8.7。 (例如鳍)

所有20条评论

我们目前不提供仅限月和日的本地化格式标记。 这将需要显着扩展数据,因为在不同的语言环境中可能有不止一种显示方式。

使用自定义格式可能更容易,而不是尝试将其放入语言环境格式中。

我也需要这种格式。
我不想让它自定义,因为它应该在所有不同的语言环境中都正确:)

同样在这里。

考虑一下, Intl.DateTimeFormat说实现应该至少支持以下子集:(...) 月、日 (...)。 可能不相关,但似乎对于特定于语言环境的消息考虑它很重要。

我只是查看了所有语言文件,对于大多数语言来说,这似乎很容易...
@mj1856 有什么想法可以开始吗?

@kaljak添加格式很容易,但是您从哪里获得有关如何用给定语言正确表达的数据? 您需要一个类似于 CLDR 的来源,或者说该语言的人才能知道这一点。

不能从这里获取: http : action=browse

同样来自这里: https://github.com/andyearnshaw/Intl.js/blob/master/locale-data/json/ ,或来自https://github.com/unicode-cldr/cldr-dates-full/ (其中还包括相对时间的短/窄版本,这将是一个很好的补充:))。

不相关,但也许在某些时候从Intl.DateTimeFormat派生特定于区域设置的格式并避免包含特定于时刻的区域设置数据可能是有意义的?

我也需要这个。

我们使用这个正则表达式来克服这个问题

moment().format('L').replace(new RegExp('[^\.]?' + moment().format('YYYY') + '.?'), '')

它执行以下转换
05/04/2017 -> 05/04(例如美国、英国)
2017-04-03 -> 04-03(例如瑞典)
8.7.2017 -> 8.7。 (例如鳍)

+1 对此。

我们的网站以本地化格式显示如下内容:
Jan 5

没有一种好的方法可以用西班牙语这样的语言来显示这个字符串,它应该是这样的:
5 de Jan没有切掉年份文本,由于语言差异,这似乎无法维护。

moment().locale('es')format('ll') // 5 de Jan de 2018

@stenvala很棒的解决方案!

当与.format('ll')我会得到一个,后缀,我该如何解决上述问题以将其删除?

例如: Jan 29, 2018 -> Jan 29,

我遇到了同样的需求,为了代替受支持的方式,我将以下代码放在我在服务中使用的帮助程序类中,并包装在 Angular 管道中以用于模板。 您的里程可能很大,但我查看了所有语言环境文件,并认为我获得了使用“ll”格式作为新月和日格式基础的所有不同排列。 我已经针对以下语言环境进行了测试:en、es、hy-am、hu、cv、ja、lv。 每个都有有趣的排列,包括月份名称中的 unicode 字母。

if (format.indexOf("YYYY") === 0) {
        // In some locales, the Year is presented first, along with various punctuation (period, comma) as well as sometimes
        // hard coded words in brackets. The RegEx below strips everything off that shouldn't be there related to the YYYY prefix.
        return format.replace(/YYYY(\.)?(\s)?(\[([^\x00-\x7F]|\w)+\])?(\s)?/gi, '');
    }

    // In other locales, the year is presented at the end (or almost end). It can have various punctuation around it as well
    // as hard coded words in brackets. The RegEx below strips everything off that shouldn't be there related to the YYYY suffix.
    return format.replace(/(\s)?,?(\[([^\x00-\x7F]|\w)+\])?(\s)?YYYY.*/gi, '');

祝你好运!

PS - 我不是 RegEx 大师,我已经尽力处理了上面的表达。 它们似乎有效,但可能可以优化。

我做了.format('MMMDo')最终得到了我想要的东西,不是通用的,但在我的情况下效果很好。

👍

使用具有多种语言格式规则的数据源怎么样。 其余语言获得占位符文本 p.ex。 '你好开发者。 请向 moment.js 项目报告您的语言格式。 谢谢'

因此,如果某些开发人员需要短日期字符串并使用它,他将收到此号召性用语,并根据需要缩小差距。

这是使用Intl的另一种解决方法。 自定义options对象以获得所需的格式。 Intl.DateTimeFormat 将处理字符串的所有本地化排序和本地分隔符。

const localizedDateMonthNoYear = (moment) => {
    if (window && window.Intl && window.Intl.DateTimeFormat) {
      let options = {
        weekday: 'short',
        month: 'short',
        day: '2-digit',
      }
      return new Intl.DateTimeFormat('default', options).format(moment.toDate())
    }
    return moment.format('ll');
}

3 年多来,在阻止moment.js 几乎被认为是完整的日期/时间格式库的关键问题上没有任何进展……谢天谢地,Intl API 正逐渐成为标准。

一些 Moment.js 核心开发人员现在致力于 TC39 提案,因为您是对的,为什么不在核心语言中包含一些此类功能?

您可以使用 JS Date 的toLocaleDateString方法。 例如

const getFormattedDateTime = dateTime => dateTime.toLocaleDateString('ru-RU', {
  month: 'short',
  day: 'numeric',
  hour: 'numeric',
  minute: 'numeric',
})

https://momentjs.com/docs/#/ -project-status/

我们不会添加新的代币。

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

paulyoung picture paulyoung  ·  3评论

tanepiper picture tanepiper  ·  3评论

Delgan picture Delgan  ·  3评论

benhathaway picture benhathaway  ·  3评论

chitgoks picture chitgoks  ·  3评论