TL;DR
对于孟加拉语 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 中引入的。它也承诺设置小数样式,因此对withDecimalStyle() 的调用应该不是必需的,但在我的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'));
੧੨ ਮਈ ੨੦੨੧, ੧੧:੫੦:੦੦ ਬਾ.ਦੁ.
提到的其余语言的规范是:
| Language |
Langauge tag |
Zero digit |
Output |
| Telugu |
te |
'\u0c66' |
౧౨ మే, ౨౦౨౧ ౧౧:౫౦:౦౦ PM |
| Tamil |
ta |
'\u0be6' |
௧௨ மே, ௨௦௨௧, பிற்பகல் ௧௧:௫௦:௦௦ |
| Kannada |
kn |
'\u0ce6' |
ಮೇ ೧೨, ೨೦೨೧ ೧೧:೫೦:೦೦ ಅಪರಾಹ್ನ |
解析你的原始字符串
我不明白为什么你的日期和时间是英文文本。您应该将日期和时间保存在正确的日期时间对象中,例如我在上面使用的 LocalDateTime 对象。如果您无法避免获得String,请解析它。使用此格式化程序进行解析:
private static final DateTimeFormatter ENGLISH_PARSER
= DateTimeFormatter.ofPattern("d MMM, uuuu h:mm a", Locale.ENGLISH);
除了我无法从您的示例中判断该字符串是否包含完整的月份名称,如 August 或缩写如 Aug (因为五月的全名中只有三个字母)。如果你得到完整的月份名称,你将需要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