提问人:stefan.at.kotlin 提问时间:4/10/2020 更新时间:11/28/2020 访问量:1034
java.time 格式日期取决于区域设置,具有 2 位数字的日/月和 4 位数字的年份
java.time format date depending on locale with 2 digits day/month and 4 digits year
问:
我需要根据本地顺序显示 2 位日期、2 位月份、4 位年份的日期。所以我想展示April 10th 2020
- 对于区域设置 US:
MM/DD/YYYY
->04/10/2020
- 对于英国地区:
DD/MM/YYYY
->10/04/2020
- 对于区域设置 DE(德国):
DD.MM.YYYY
->10.04.2020
我尝试了以下方法,但没有成功:
// this one already fails for DE, because it gives 10.04.20 (only 2 digit years)
myDate?.format(DateTimeFormatter.ofLocalizedDate(FormatStyle.SHORT))
// works for DE (gives 10.04.2020), fails for UK as is gives 10 Apr 2020 instead of 10/04/2020
myDate?.format(DateTimeFormatter.ofLocalizedDate(FormatStyle.MEDIUM))
那么,我怎样才能获得只有 2 位数字日/月和 4 位数字年份的本地适应日期格式?请注意,我正在寻找一个通用的解决方案,这里明确说明的 3 个区域设置只是示例。
我实际上正在使用 Android 端口(),尽管这应该无关紧要。java.time
ThreeTenABP
答:
3赞
Anonymous
4/11/2020
#1
恐怕需要一些手工工作。例如,在 Java 中,因为这是我可以写的:
Locale formattingLocale = Locale.getDefault(Locale.Category.FORMAT);
String builtInPattern = DateTimeFormatterBuilder.getLocalizedDateTimePattern(
FormatStyle.SHORT, null, IsoChronology.INSTANCE,
formattingLocale);
String modifiedPattern = builtInPattern.replaceFirst("y+", "yyyy")
.replaceFirst("M+", "MM")
.replaceFirst("d+", "dd");
DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern(modifiedPattern, formattingLocale);
LocalDate myDate = LocalDate.of(2020, Month.APRIL, 10);
System.out.println(myDate.format(dateFormatter));
不同语言环境中的示例输出:
- 美国: 04/10/2020
- 英国:10/04/2020
- 德国: 10.04.2020
- 瑞典语/: 2020-04-10
sv
- 香港/: 2020年04月10日 (我不知道这是否正确)
zh-HK
0赞
Marko T
11/28/2020
#2
Ole V.V.的答案从奥利奥开始起作用,但许多设备都在使用旧版本的Android。以下内容适用于大多数国家/地区的所有 Android 版本。
这看起来很骇人听闻,但 DateFormat 的官方 JavaDoc 表示,将格式从工厂方法转换为 SimpleDateFormat 在大多数国家/地区都有效。
val dateFormat = DateFormat.getDateInstance(DateFormat.SHORT)
if (dateFormat is SimpleDateFormat) {
val adjustedPattern = dateFormat.toPattern()
.replace("y+".toRegex(), "yyyy")
.replace("M+".toRegex(), "MM")
.replace("d+".toRegex(), "dd")
dateFormat.applyPattern(adjustedPattern)
}
你可以把它包装在一个try-catch-block中,并为少数几个不起作用的特殊国家做一些聪明的事情。或者对于他们来说,你可以放弃并使用他们默认的短格式。我很确定人类可以理解这种格式:-D。
评论
1赞
Anonymous
6/28/2022
供您参考,当 OP 说我实际上正在使用 Android 的 java.time
端口 (ThreeTenABP) 时,那么 ThreeTenABP
库完全是为 Oreo 之前的 Android 版本(API 级别 26)而开发的(尽管它也适用于更高版本)。
评论