datefns 格式未完全格式化

问题描述

我正在使用 react 和 datefns。

我有以下代码

import { enUS,ja } from 'date-fns/locale';
import { format,isValid,parseISO } from 'date-fns';


export const getDateLocal = (locale?: string) => {
  switch (locale) {
    case 'ja':
      return ja;
    case 'en':
    default:
      return enUS;
  }
};

export const localizedDateFormatter = (
  date: Date | number | string,dateFormat = 'MMM dd',locale = 'en'
): string => {
  const dateIsIso = typeof date === 'string' ? isValid(parseISO(date)) : false;
  if (!date || (!dateIsIso && !isValid(date))) {
    return '-';
  }

  return format(new Date(date),dateFormat,{ locale: getDateLocal(locale) });
};

我这样调用这个函数

localizedDateFormatter(hoverFrom,'MMM dd,yyyy',i18n.language) // can be ja or en

问题是,日期没有像我想要的那样转换。

ja: 12月 15,2020 

en: Dec 15,2020

虽然应该

ja: 2020年1月13日 (or at least 1月13日,2020年)

en: Dec 15,2020

为什么会这样?

解决方法

免责声明

我对日语一窍不通,所以我可以通过查看源代码来给出答案,但也许一些说日语的人可以给出更准确的答案。


您可以在此处查看区域设置源代码 https://github.com/date-fns/date-fns/tree/master/src/locale/ja/_lib,但这里有一些我设法发现的见解。

白天

字符以序数形式跟在日期之后(它似乎也是星期日的名称)。看看here。所以你需要 do(月中的序数日)。

当显示月份名称(缩写或完整)时, 字符跟在月份数字之后。因此,如果您使用 M 显示月份,它将不会显示。您需要 MMMMMMM。比较 JAEN-US

年份

字符仅在日期为长格式时才跟在年份之后。该字符不在 this 文件中,但在长日期和完整日期格式(PPPPPPP)中是 here


您要查找的日语格式是 PPP,它显示的日期如下:

  • 中文:2020 年 2 月 15 日
  • JA:2020年2月15日

最接近您要查找的格式的是MMM do,yyyy

  • 中文:2020 年 2 月 15 日
  • JA:2020 年 2 月 15 日