Nie*_*jes 9 java locale datetime-parsing java-17
在 Java 中,Locale
定义了与人们希望如何看待事物相关的事物(例如货币格式、月份名称以及一周的开始时间)。
当解析月份的名称(带有DateTimeFormatter
)时,它开始变得棘手。
如果您使用Locale.US
或Locale.ENGLISH
则九月有缩写形式Sep
。
如果您使用Locale.UK
,那么 September 在 Java 11 中也有缩写形式Sep
……但是当您尝试 Java 17 时,它就会有Sept
(因为 Unicode CLDR 端发生了变化,我询问这是否正确)。
结果是,当我尝试使用 Java 17 进行构建时,我的测试开始失败。
我当前的代码使用Locale.UK
而不是Locale.ENGLISH
因为在Java中Locale.ENGLISH
实际上不仅是英语,而且还是非ISO美国定义一周的方式(他们使用星期日作为一周的第一天)。我想以 ISO 方式获得它。
简单地:
WeekFields.ISO
= WeekFields.of(Locale.UK)
=WeekFields[MONDAY,4]
WeekFields.of(Locale.ENGLISH)
= WeekFields.of(Locale.US)
=WeekFields[SUNDAY,1]
因此,从 Java 17 开始,我还无法找到可以正常工作的内置语言环境。
在我看来,我必须选择Locale.ENGLISH
并将9 月的简称更改为我需要的WeekFields
。Locale.UK
我的问题是如何做到这一点(在 Java 17 中)?
或者有更好的方法来解决这个问题吗?
更新1:
所以看来我不仅需要一个接受“Sep”的解析器,而且需要一个接受英语“Sept”和“Sep”混合的解析器。
更新2:
我找到了一种使用 SPI 来处理这个问题的方法。
我在这里将其记录为可能对其他人有用的可能性(它不适用于我的上下文)。
作为实验,我创建了一个类:
package nl.basjes.parse.httpdlog.dissectors.locale;
import java.util.Locale;
import java.util.spi.CalendarDataProvider;
import static java.util.Calendar.MONDAY;
public class CalendarDataProviderISO8601 extends CalendarDataProvider {
public static final Locale ENGLISH_ISO = new Locale("en", "", "ISO");
@Override
public int getFirstDayOfWeek(Locale locale) {
return MONDAY;
}
@Override
public int getMinimalDaysInFirstWeek(Locale locale) {
return 4;
}
@Override
public Locale[] getAvailableLocales() {
return new Locale[]{ENGLISH_ISO};
}
}
Run Code Online (Sandbox Code Playgroud)
和一个./src/main/resources/META-INF/services/java.util.spi.CalendarDataProvider
文件
nl.basjes.parse.httpdlog.dissectors.locale.CalendarDataProviderISO8601
Run Code Online (Sandbox Code Playgroud)
因为这只是无区域“英语”的一个变体,所以它将获取“英语”中的所有内容,并将上面的类放在上面。
虽然这有效,但我无法使用它。
问题是,尽管http://openjdk.java.net/jeps/252描述了The default lookup order will be CLDR, COMPAT, SPI,
当前的实际情况,但 SPI 已在此更改中从该列表中删除,因为deprecating the Extension Mechanism
.
因此,要使用此构造,类必须在启动时位于类路径中,并且-Djava.locale.providers=CLDR,COMPAT,SPI
必须将命令行选项传递到 JVM。
鉴于我的库(https://github.com/nielsbasjes/logparser/)也用于以更动态的方式传送类(序列化并传输到已经存在的类)的情况(例如 Apache Flink/Beam/Drill/Pig)运行 JVM)到多台机器,不能使用此构造。
我目前不知道dynamic
在 Java 中做这样的事情的方法。
归档时间: |
|
查看次数: |
1348 次 |
最近记录: |