是否有一种方法可以按照Java/Kotlin中的区域设置正确的顺序格式化一天和一个月(以紧凑的形式),而不是按年份编排?所以对于英语来说,应该是“9月20日”,而瑞典语则是“9月20日”。
作为比较,在Cocoa平台上,我可以做以下工作(在Swift中):
let formatter = DateFormatter()
formatter.locale = Locale(identifier: "sv_SE")
formatter.setLocalizedDateFormatFromTemplate("MMM d")
print(formatter.string(from: Date()))这将正确地扭转局面。与Java有类似的关系吗?我一直在用DateTimeFormatter和旧的SimpleTimeFormat API尝试各种形式,但都没有成功。
注释:与这个问题不同,我不想要包含年份的完整的中等格式。我也不想要DateTimeFormatter.ofPattern("MMM d"),因为这给出了瑞典语的不正确结果,或者DateTimeFormatter.ofPattern("d MMM"),因为这在英语中给出了错误的结果。
发布于 2019-06-28 07:18:49
不,对不起。我知道没有任何Java库会自动将"MMM d"转换为20 sep.,因为区域设置更喜欢月份缩写前的月份。
您可以尝试以这种方式修改按行回答:
DateTimeFormatter ft =
DateTimeFormatter
.ofLocalizedDate(FormatStyle.MEDIUM)
.withLocale(Locale.forLanguageTag("sv-SE"))
;然而,其结果是:
9月20日2019
包括你没有要求的那一年。
高级解决方案将使用DateTimeFormatterBuilder类构建DateTimeFormatter对象。
DateTimeFormatterBuilder
.getLocalizedDateTimePattern(
FormatStyle.MEDIUM,
null,
IsoChronology.INSTANCE,
Locale.forLanguageTag("sv-SE")
)这将返回d MMM y。修改此字符串以删除y及其前面的空格。注意,在其他语言中,y可能是yy、yyyy或u,而不是字符串中的最后一个。将修改后的格式模式字符串传递给DateTimeFormatter.ofPattern。
可能很不稳定。即使您查看了所有可用区域设置的格式模式字符串,下一个版本的CLDR (字符串的来源)仍然可能包含一个惊喜。但我认为这是我们所能做的最好的了。如果是我,我会考虑抛出一个异常,以防检测到来自getLocalizedDateTimePattern的字符串看起来不像我知道如何修改的字符串。
发布于 2019-06-28 06:55:30
您可以使用LocalDate在Java中完成此操作:
LocalDate dt = LocalDate.parse("2019-09-20");
System.out.println(dt);
DateTimeFormatter ft = DateTimeFormatter.ofPattern("dd MMM", new Locale("sv","SE"));
System.out.println(ft.format(dt));发布于 2022-05-24 10:32:12
您可以获得DateFormat的模式并删除该年:
val locale: Locale
val datePattern = (DateFormat.getDateInstance(DateFormat.MEDIUM, locale) as SimpleDateFormat).toPattern()
.replace("y", "").trim { it < 'A' || it > 'z' }https://stackoverflow.com/questions/56802168
复制相似问题