java - 是否有可能以适用于 Java 中所有语言环境的方式编写自定义日期格式?

标签 java date date-formatting localdate

我的目标是以如下格式显示日期:

<表类="s-表"> <头> 国家 例子 模式 <正文> 美国 1 月 3 日,星期二 EEE, LLL d 法国 三月3 简夫. EEE d LLL

我正在使用 DateTimeFormatter.ofPattern格式化我的日期。

有没有一种方法可以在不为每个语言环境编写模式的情况下实现这一点?

编辑:我将非常具体地说明我的用例:我正在尝试格式化 LocalDate实现这个日期选择器:m3.material.io/components/date-pickers/…

最佳答案

不是作为一种模式,不。例如,一种模式编码顺序 - 不可能有一种模式使得“在法语中”它会在月份日期之后粘贴月份,而“在英语中”它'会被逆转。充其量,单一模式的本地化翻译名称;一个模式可以产生 Tue, Jan 3Mar., janv。 3。这不是您想要的。

您要找的方法是ofLocalizedDate(dateStyle) .这会产生一个“懒惰”的 DTF 实例 - 它没有模式,它只知道“我需要在区域设置 X 中为‘中等标准格式’传递任何信息”,其中 X 是DTF。

没有编码此行为的模式。

for (var locale : List.of(Locale.ENGLISH, Locale.FRENCH)) {
  for (var style : FormatStyle.values()) {
    var dtf = DateTimeFormatter.ofLocalizedDate(style).withLocale(locale);
    System.out.printf("%s %s: %s\n", locale, style, dtf.format(LocalDate.of(2023, 1, 3)));
  }
}

结束打印:

en FULL: Tuesday, January 3, 2023
en LONG: January 3, 2023
en MEDIUM: Jan 3, 2023
en SHORT: 1/3/23
fr FULL: mardi 3 janvier 2023
fr LONG: 3 janvier 2023
fr MEDIUM: 3 janv. 2023
fr SHORT: 03/01/2023

这显示了 DTF 的 ofLocalizedDate 变体的动态特性。

请记住,DateTimeFormatter 不是必然基于模式的概念。图案只是制作它们的一种方式。这种方式不允许您通过调用 .withLocale 来更改它们的外观。其他制作 DTF 的方法,例如 .ofLocalizedDate确实允许它。

如果您要将某物存储在数据库中或向用户询问某物,那么您必须做出不同的选择:用户首先选择他们想要“模式”还是“样式”,因此您将其存储(数据库中的枚举列,或用户界面中的单选按钮集),然后根据他们选择的内容,存储样式值(完整、长、中等或短)——再次是用户界面中的单选按钮集或db col 中的枚举,或者存储模式(string/VARCHAR/TEXT/JTextField,类似这些)。根据“样式”,您通过检查“变体”选项(样式或模式)并调用 .ofPattern.ofLocalizedDate 来从此类存储的首选项构造 DTF 实例.当您使用它时,您可能希望原始单选按钮集(“模式”或“样式”)也包含 ISO8601 样式。

注意:DTF 类.getPattern() 方法是有原因的;那是因为并非所有 DTF 实例都有一个。

关于java - 是否有可能以适用于 Java 中所有语言环境的方式编写自定义日期格式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74995307/

相关文章:

Java 8 - tz 数据库时区

Swift:获取 'Specific Date' 之前 30 天的信息

java - 如何使用 SXSSF Streaming api 编辑现有的大型 Excel 文件

java - 如何使用来自不同 Activity 的 SharedPreferences?

ruby-on-rails - Ruby on Rails : Show results between 2 dates

PHP fatal error : Call to a member function format() on boolean

SQL日期转换结果为 "invalid number format model parameter."

string - 如何从日期字符变量中删除时间字段字符串?

java - Elasticsearch 返回 Integer 但我的映射中的字段明确是 Long

java - 处理一个大的正则表达式问题