java - 将日期和时间翻译成 java.util.Locale 不支持的语言
问题描述
我有用英文表示日期和时间的文本。
例如:12 May, 2021 11:50 PM
java.util.Locale
我想将其翻译成API本身不支持的各种语言。
这种语言的例子有孟加拉语、马拉地语、旁遮普语、泰卢固语、泰米尔语、卡纳达语等。
例如,在孟加拉语中,上述文本将翻译为:১২ই মে, ২০২১ এর ১১:৫০ PM
是否有捷径可寻?
非常感谢。
解决方案
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
推荐阅读
- python - 无法在 Python 3.6.6 上的 Open CV 3.4.1 上运行跟踪
- c# - C#如何互相访问表单对象
- django - 错误:尝试获取任何值时无法调整类型 ExpressionWrapper
- sql - SQL Server:如何将浮点数格式化为字符串,不带逗号?
- android - Map Android 开发的跟踪要求
- android - 如何通过 kotlin 代码更改 android 中的笔触颜色?
- python - RuntimeError:超时上下文管理器应该在任务内部使用
- php - 想从最后一个 id 中提取一个子字符串
- .net - 当在角度 js 1.5.8 中绑定 json 响应数组时,浏览器中的根范围异常处理程序
- java - 为什么子类无法访问超类受保护变量?