首页 > 解决方案 > 将日期和时间翻译成 java.util.Locale 不支持的语言

问题描述

我有用英文表示日期和时间的文本。

例如:12 May, 2021 11:50 PM

java.util.Locale我想将其翻译成API本身不支持的各种语言。

这种语言的例子有孟加拉语、马拉地语、旁遮普语、泰卢固语、泰米尔语、卡纳达语等。

例如,在孟加拉语中,上述文本将翻译为:১২ই মে, ২০২১ এর ১১:৫০ PM

是否有捷径可寻?

非常感谢。

标签: javadatetimelocaletranslate

解决方案


TL;博士

对于孟加拉语 AKA 孟加拉语:

    Locale loc = Locale.forLanguageTag("bn"); // Bengali/Bangla
    DateTimeFormatter formatter
            = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.MEDIUM)
                    .localizedBy(loc)
                    .withDecimalStyle(DecimalStyle.of(loc));

    LocalDateTime dateTime = LocalDateTime.of(2021, Month.MAY, 12, 23, 50);
    System.out.println(dateTime.format(formatter));

输出是:

১২ মে, ২০২১ ১১:৫০:০০ PM

细节

Java 确实支持您提到的语言。

我使用的localizedBy方法是在 Java 10 中引入的。它也承诺设置小数样式,所以调用 towithDecimalStyle()不应该是必需的,但在我的 Java 11 中是这样。我不知道这是一个错误还是什么。

您还提到了马拉地语:

    Locale loc = Locale.forLanguageTag("mr"); // Marathi

१२मे, २०२१, ११:५०:०० म.उ。

对于提到的其余语言,我的 Java 11 似乎不知道要使用的数字。所以我们必须自己指定这些。只有我们只需要为 0(零)指定数字。然后 Java 计算出其余部分。

    Locale loc = Locale.forLanguageTag("pa"); // Punjabi
    DateTimeFormatter formatter
            = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.MEDIUM)
                    .localizedBy(loc)
                    .withDecimalStyle(DecimalStyle.of(loc)
                            .withZeroDigit('\u0a66'));

੧੨ ਮਈ ੨੦੨੧, ੧੧:੫੦:੦੦ ਬਾ.ਦੁ。

提到的其余语言的规范是:

语言标签 零位 输出
泰卢固语 te '\u0c66' ౧౨ మే, ౨౦౨౧ ౧౧:౫౦:౦౦ PM
泰米尔语 ta '\u0be6' ௧௨ மே, ௨௦௨௧, பிற்பகல் ௧௧:௫௦:௦௦
卡纳达语 kn '\u0ce6' ಮೇ ೧೨, ೨೦೨೧ ೧೧:೫೦:೦೦ ಅಪರಾಹ್ನ</td>

解析你的原始字符串

我不明白为什么你的日期和时间是英文文本。您应该将日期和时间保存在正确的日期时间对象中,例如LocalDateTime我上面使用的对象。如果您无法避免得到 a String,请解析它。使用此格式化程序进行解析:

private static final DateTimeFormatter ENGLISH_PARSER
        = DateTimeFormatter.ofPattern("d MMM, uuuu h:mm a", Locale.ENGLISH);

除了我无法从您的示例中判断该字符串是否包含完整的月份名称August或缩写Aug(因为 May 的全名中只有三个字母)。如果你得到完整的月份名称,你将需要MMMM而不是MMM. 无论如何解析如下:

    String dateTimeText = "12 May, 2021 11:50 PM";
    LocalDateTime dateTime = LocalDateTime.parse(dateTimeText, ENGLISH_PARSER);
    System.out.println(dateTime);

输出:

2021-05-12T23:50


推荐阅读