当前位置: 首页 > 知识库问答 >
问题:

Quarkus GraalVM本机图像日期时间格式和本地化

狄新翰
2023-03-14

我尝试在java中使用本地化以本地样式打印日期。我已经使用数字和货币制作了类似的功能,但我未能将相同的行为应用到日期。

正如我在几天前发布此主题时所了解的,GraalVM Quarkus Locale在本机模式下,使用本机模式下的本地化需要使用创建一个“@AutomaticFeature”。

这个技巧适用于数字和货币:

@AutomaticFeature
public class NativeNumberFormatFeature implements Feature {

    @Override
    public void beforeAnalysis(BeforeAnalysisAccess access) {
        ImageSingletons
                .lookup(RuntimeClassInitializationSupport.class)
                .initializeAtBuildTime(NumberFormatSupport.class, this.getClass().getName());

        ImageSingletons.add(NumberFormatSupport.class, new NumberFormatSupport());
    }

}

public class NumberFormatSupport {

    private Map<Locale, NumberFormat> numberInstancesByLocale;
    private Map<Locale, Map<String, NumberFormat>> currencyInstancesByLocale;

    public NumberFormatSupport() {
        numberInstancesByLocale = new HashMap<>();
        currencyInstancesByLocale = new HashMap<>();
        for (Locale locale : Locale.getAvailableLocales()) {
            numberInstancesByLocale.put(locale, NumberFormat.getNumberInstance(locale));
            currencyInstancesByLocale.put(locale, new HashMap<>());
            for (Currency currency : Currency.getAvailableCurrencies()) {
                currencyInstancesByLocale.get(locale).put(currency.getCurrencyCode(), NumberFormat.getCurrencyInstance(locale));
                currencyInstancesByLocale.get(locale).get(currency.getCurrencyCode()).setCurrency(currency);
            }
        }
    }

    public NumberFormat getNumberFormat(Locale locale) {
        return (NumberFormat) numberInstancesByLocale.get(locale).clone();
    }

    public NumberFormat getCurrencyFormat(Locale locale, Currency currency) {
        return (NumberFormat) currencyInstancesByLocale.get(locale).get(currency.getCurrencyCode()).clone();
    }

}

但它不适用于DateTimeFormatter:

@AutomaticFeature
public class NativeDateFormatterFeature implements Feature {

    @Override
    public void beforeAnalysis(BeforeAnalysisAccess access) {
        ImageSingletons
                .lookup(RuntimeClassInitializationSupport.class)
                .initializeAtBuildTime(DateFormatterSupport.class, this.getClass().getName());

        ImageSingletons.add(DateFormatterSupport.class, new DateFormatterSupport());
    }
}

public class DateFormatterSupport {

    private Map<Locale, DateTimeFormatter> dateTimeFormatterByLocale;

    public DateFormatterSupport() {
        dateTimeFormatterByLocale = Arrays.stream(Locale.getAvailableLocales()).collect(Collectors.toMap(
            Function.identity(),
            l -> DateTimeFormatter.ofLocalizedDate(FormatStyle.MEDIUM).withLocale(l)));
    }

    public DateTimeFormatter get(Locale locale) {
        return dateTimeFormatterByLocale.get(locale);
    }

}

在开发模式下一切正常,但在原生模式下,语言环境被忽略。风格总是一样的,月份名称没有翻译。我在谷歌上寻找解决方案,但我没有找到任何东西,所以我在StackOverflow上询问。

如果需要,我随时为您服务。

你好,斯特凡。

共有1个答案

严劲
2023-03-14

我不明白为什么,但以下解决方案有效:

public class DateFormatterSupport {

    private Map<Locale, DateTimeFormatter> dateTimeFormatterByLocale;

    public DateFormatterSupport() {
        dateTimeFormatterByLocale = Arrays.stream(Locale.getAvailableLocales()).collect(Collectors.toMap(
            Function.identity(),
            l -> DateTimeFormatter.ofLocalizedDate(FormatStyle.MEDIUM).withLocale(l)));

        Arrays.stream(Locale.getAvailableLocales()).forEach(locale -> {
            dateTimeFormatterByLocale.get(locale).format(LocalDate.now());
        });
    }

    public DateTimeFormatter get(Locale locale) {
        return dateTimeFormatterByLocale.get(locale);
    }

}
 类似资料:
  • 问题内容: 我有一个关于Spring + Thymeleaf日期格式的问题。我有一个简单的实体与领域。我想以表单形式从用户那里获取此日期并将其保存到MySQL数据库。我收到这样的错误: 无法将类型java.lang.String的属性值转换为属性日期所需的类型java.time.LocalDate;嵌套异常是org.springframework.core.convert.ConversionFa

  • 我想把这个2021年1月20日20:10:14转换成yyyy-MM-dd'T'HH:MM:ss格式。Android系统中的SSS'Z'。目前我正在使用函数,但当我转换为本地格式时,我没有得到原始时间

  • 问题内容: 我正在尝试将一个实例转换为一个实例。 我没有得到编译器错误,但是实例值是错误的。 我认为这不起作用,因为它存储时间而不是。 我正在使用JDK 1.8版。 问题答案: 您的输入实际上是一个。简单地将其解析为a 然后从中获取会更简单。无需担心时区,无需保留某些传统课程(避免并在可能的情况下…)

  • 因此,有一个关于web应用程序的部分,用户可以向其中输入事件,web服务将这些事件以以下格式发送到移动应用程序: 我在尝试将字符串转换为日期时遇到了问题,这样我就可以从事件中获得时间(也可以在正确的时区中格式化),例如,这里有一个出现在“2015-03-20T20:00:00-07:00”上的字符串,当我拉动时,时间应该是太平洋时间1PM。但我得到的不是8PM就是3AM(这取决于我是否将UTC缩写

  • 问题内容: 如何在Swift中获取本地日期和时间? 问题答案: 我已经找到答案了。

  • 我有一个简单的JavaLocalDateTime如下: 它的结果是: 我希望是2021年3月23日下午1点17分 我在这里错过了什么?