时刻 vs date-fns 语言环境日期格式

Posted

技术标签:

【中文标题】时刻 vs date-fns 语言环境日期格式【英文标题】:moment vs date-fns locale date formats 【发布时间】:2018-04-26 13:50:03 【问题描述】:

我正在我们的应用程序上下文中评估 DateFns 和 Moment,并发现 DateFns 中似乎有一个重要的遗漏。

在 Moment 中,区域设置支持允许您格式化日期或时间的区域设置正确表示。例如,日期格式“LL”和“L”将为英语语言环境生成以下内容:

November 27, 2017
11/27/2017

以下是西班牙语语言环境:

27 de noviembre de 2017
27/11/2017

请特别注意,在第二个示例中,在英语中,月份在日期之前,而在西班牙语中,日期在月份之前。这正是您希望语言环境代码为您处理的事情。这就是语言环境在几乎所有日期时间库(C++、C#、Java、Python 等)中的工作方式

在 DateFns 中,似乎没有 format option for locale-correct long date, short date, time, etc.。他们给出的使用语言环境的示例要求您将特定于语言环境的格式字符串传递给它:

// Represent 2 July 2014 in Esperanto:
var eoLocale = require('date-fns/locale/eo')
var result = format(
  new Date(2014, 6, 2),
  'Do [de] MMMM YYYY',
  locale: eoLocale
)

换句话说,我需要知道我支持的每个语言环境的日期/时间格式,这违背了首先支持语言环境的目的。]

我可以使用 javascript 的 toLocaleString,但我的应用程序以两种不同的方式管理语言环境。

有没有什么方法可以打印出特定语言环境的“短日期”,而无需我告诉 DateFns 该语言环境的格式是什么?

【问题讨论】:

它应该在date-fns@2.0.0可用(尚未发布,alpha-7版本正在进行中)date-fns.org/v2.0.0-alpha.7/docs/format 也许您可以使用developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… 作为替代方案。 【参考方案1】:

我使用的是 esm 版本的 date-fns,你可以使用和 moment 相同的格式:

import  format  from 'date-fns/esm'
import  enUS, fr  from 'date-fns/esm/locale'

我会将语言环境存储在一个对象中:

this.dateLocales =  fr: fr, en: enUS 

并使用这些格式:

LT: 'h:mm aa',
LTS: 'h:mm:ss aa',
L: 'MM/DD/YYYY',
LL: 'MMMM D YYYY',
LLL: 'MMMM D YYYY h:mm aa',
LLLL: 'dddd, MMMM D YYYY h:mm aa'

所以你可以这样做:

format(
  new Date(2014, 6, 2),
  'LL',
  locale: this.dateLocales.fr
)

这些格式已本地化

【讨论】:

嘿@Lakston,感谢您的提示,您的答案似乎使用了字符串而不是常量,这是故意的吗?您能否解释一下不同格式是如何定义的? 你说得对,我忘了指定我有一个对象来存储语言环境,我没有传递字符串而是对我的导入的引用,如果不清楚,我会更新我的答案足够了,不要犹豫,询问更多信息。 我只是好奇,但我认为这个答案在date-fns@2.0.0 发布之前仍然对某些人有帮助:) 我的答案适用于 2.0.0 alpha,因此当他们正式发布 RC 时,您无需更改任何或很少的代码;)【参考方案2】:

截至 2021 年,使用当前最新版本的 date-fns (v2.23.0),您可以使用“P”格式实现您想要的。

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

例如,假设今天是 2021-08-27(ISO 日期):

import  format  from 'date-fns';
import ptBrLocale from 'date-fns/locale/pt-BR';
import enUsLocale from 'date-fns/locale/en-US';

console.log(format(new Date(), 'P',  locale: ptBrLocale ));
console.log(format(new Date(), 'P',  locale: enUsLocale ));

输出将是:

27/08/2021
08/27/2021

【讨论】:

以上是关于时刻 vs date-fns 语言环境日期格式的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 JavaScript date-fns 库在特定时区格式化日期/时间

UTC时刻,date-fns有类似的东西吗?

如何使用 date-fns 格式化日期?

使用 ISO-8601 格式的 date-fns 获取当前日期

获取 date-fns 中两个日期之间的持续时间,以天:小时:分钟:秒格式

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