oracle / graal

GraalVM compiles Java applications into native executables that start instantly, scale fast, and use fewer compute resources 🚀
https://www.graalvm.org
Other
20.34k stars 1.63k forks source link

LocalDate is not formatted as specified in the locale #3757

Closed pe closed 9 months ago

pe commented 3 years ago

Describe the issue A LocalDate formatted with DateTimeFormatter is not in the correct locale-specific format

Steps to reproduce the issue

Using this code:

import java.time.LocalDate;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.time.format.FormatStyle;
import java.util.Locale;

public class Test {
   private static final DateTimeFormatter SHORT_DATE = DateTimeFormatter.ofLocalizedDate(FormatStyle.SHORT);
   private static final DateTimeFormatter SHORT_TIME = DateTimeFormatter.ofLocalizedTime(FormatStyle.SHORT);

   public static void main(String[] args) {
      System.out.println(Locale.getDefault());
      System.out.println(SHORT_DATE.format(LocalDate.now()));
      System.out.println(SHORT_TIME.format(LocalTime.now()));
   }
}

Compiling and running it:

> env | grep LANG
LANG=de_CH.UTF-8
> javac Test.java
> java Test
de_CH
06.09.21
20:31
> native-image Test
…
> ./test
en_US   <--- should be de_CH?
9/6/21
8:32 PM
> native-image Test -H:DefaultLocale=de_CH
…
> ./test
de_ch
2021-09-06  <--- should be 06.09.21
20:33

Reading https://www.graalvm.org/reference-manual/native-image/Resources/ my understanding is that the default locale should be the system locale. And I'd expect a date do be formatted accordingly.

Describe GraalVM and your environment:

More details

> java --version
openjdk 16.0.1 2021-04-20
OpenJDK Runtime Environment GraalVM CE 21.1.0 (build 16.0.1+9-jvmci-21.1-b05)
OpenJDK 64-Bit Server VM GraalVM CE 21.1.0 (build 16.0.1+9-jvmci-21.1-b05, mixed mode, sharing)
> native-image Test -H:DefaultLocale=de_CH.UTF-8 --native-image-info --verbose
Executing [
/Library/Java/JavaVirtualMachines/graalvm-ce-java16-21.1.0/Contents/Home/bin/java \
-XX:+UseParallelGC \
-XX:+UnlockExperimentalVMOptions \
-XX:+EnableJVMCI \
-Dtruffle.TrustAllTruffleRuntimeProviders=true \
-Dtruffle.TruffleRuntime=com.oracle.truffle.api.impl.DefaultTruffleRuntime \
-Dgraalvm.ForcePolyglotInvalid=true \
-Dgraalvm.locatorDisabled=true \
-Dsubstratevm.IgnoreGraalVersionCheck=true \
--add-exports=java.base/jdk.internal.module=ALL-UNNAMED \
--add-exports=jdk.internal.vm.ci/jdk.vm.ci.aarch64=ALL-UNNAMED \
--add-exports=jdk.internal.vm.ci/jdk.vm.ci.amd64=ALL-UNNAMED \
--add-exports=jdk.internal.vm.ci/jdk.vm.ci.code.site=ALL-UNNAMED \
--add-exports=jdk.internal.vm.ci/jdk.vm.ci.code.stack=ALL-UNNAMED \
--add-exports=jdk.internal.vm.ci/jdk.vm.ci.code=ALL-UNNAMED \
--add-exports=jdk.internal.vm.ci/jdk.vm.ci.common=ALL-UNNAMED \
--add-exports=jdk.internal.vm.ci/jdk.vm.ci.hotspot.aarch64=ALL-UNNAMED \
--add-exports=jdk.internal.vm.ci/jdk.vm.ci.hotspot.amd64=ALL-UNNAMED \
--add-exports=jdk.internal.vm.ci/jdk.vm.ci.hotspot=ALL-UNNAMED \
--add-exports=jdk.internal.vm.ci/jdk.vm.ci.meta=ALL-UNNAMED \
--add-exports=jdk.internal.vm.ci/jdk.vm.ci.runtime=ALL-UNNAMED \
--add-exports=jdk.internal.vm.ci/jdk.vm.ci.services=ALL-UNNAMED \
--add-opens=jdk.internal.vm.compiler/org.graalvm.compiler.debug=ALL-UNNAMED \
--add-opens=jdk.internal.vm.compiler/org.graalvm.compiler.nodes=ALL-UNNAMED \
--add-opens=jdk.unsupported/sun.reflect=ALL-UNNAMED \
--add-opens=java.base/jdk.internal.module=ALL-UNNAMED \
--add-opens=java.base/jdk.internal.ref=ALL-UNNAMED \
--add-opens=java.base/jdk.internal.reflect=ALL-UNNAMED \
--add-opens=java.base/java.io=ALL-UNNAMED \
--add-opens=java.base/java.lang=ALL-UNNAMED \
--add-opens=java.base/java.lang.reflect=ALL-UNNAMED \
--add-opens=java.base/java.lang.invoke=ALL-UNNAMED \
--add-opens=java.base/java.lang.ref=ALL-UNNAMED \
--add-opens=java.base/java.net=ALL-UNNAMED \
--add-opens=java.base/java.nio=ALL-UNNAMED \
--add-opens=java.base/java.nio.file=ALL-UNNAMED \
--add-opens=java.base/java.security=ALL-UNNAMED \
--add-opens=java.base/javax.crypto=ALL-UNNAMED \
--add-opens=java.base/java.util=ALL-UNNAMED \
--add-opens=java.base/java.util.concurrent.atomic=ALL-UNNAMED \
--add-opens=java.base/sun.security.x509=ALL-UNNAMED \
--add-opens=java.base/jdk.internal.logger=ALL-UNNAMED \
--add-opens=org.graalvm.sdk/org.graalvm.nativeimage.impl=ALL-UNNAMED \
--add-opens=org.graalvm.sdk/org.graalvm.polyglot=ALL-UNNAMED \
--add-opens=org.graalvm.truffle/com.oracle.truffle.polyglot=ALL-UNNAMED \
--add-opens=org.graalvm.truffle/com.oracle.truffle.api.impl=ALL-UNNAMED \
--add-opens=java.base/jdk.internal.org.objectweb.asm=ALL-UNNAMED \
--add-opens=java.base/sun.util.locale.provider=ALL-UNNAMED \
--add-opens=java.base/sun.util.resources=ALL-UNNAMED \
--add-opens=java.base/sun.security.util=ALL-UNNAMED \
--add-opens=java.base/sun.util.calendar=ALL-UNNAMED \
--add-opens=java.base/sun.security.provider=ALL-UNNAMED \
--add-opens=java.base/sun.security.jca=ALL-UNNAMED \
--add-opens=java.base/sun.reflect.generics.repository=ALL-UNNAMED \
--add-opens=java.base/sun.reflect.generics.reflectiveObjects=ALL-UNNAMED \
--add-opens=java.base/sun.reflect.generics.tree=ALL-UNNAMED \
--add-opens=java.base/sun.reflect.annotation=ALL-UNNAMED \
--add-opens=java.base/sun.invoke.util=ALL-UNNAMED \
--add-opens=java.xml.crypto/org.jcp.xml.dsig.internal.dom=ALL-UNNAMED \
-XX:+UseJVMCINativeLibrary \
-Xss10m \
-Xms1g \
-Xmx14g \
-Duser.country=US \
-Duser.language=en \
-Djava.awt.headless=true \
-Dorg.graalvm.version=21.1.0 \
-Dorg.graalvm.config=CE \
-Dcom.oracle.graalvm.isaot=true \
-Djava.system.class.loader=com.oracle.svm.hosted.NativeImageSystemClassLoader \
-Xshare:off \
--module-path \
/Library/Java/JavaVirtualMachines/graalvm-ce-java16-21.1.0/Contents/Home/lib/truffle/truffle-api.jar \
-Djdk.internal.lambda.disableEagerInitialization=true \
-Djdk.internal.lambda.eagerlyInitialize=false \
-Djava.lang.invoke.InnerClassLambdaMetafactory.initializeLambdas=false \
-javaagent:/Library/Java/JavaVirtualMachines/graalvm-ce-java16-21.1.0/Contents/Home/lib/svm/builder/svm.jar \
-cp \
/Library/Java/JavaVirtualMachines/graalvm-ce-java16-21.1.0/Contents/Home/lib/svm/builder/llvm-wrapper-shadowed.jar:/Library/Java/JavaVirtualMachines/graalvm-ce-java16-21.1.0/Contents/Home/lib/svm/builder/svm.jar:/Library/Java/JavaVirtualMachines/graalvm-ce-java16-21.1.0/Contents/Home/lib/svm/builder/objectfile.jar:/Library/Java/JavaVirtualMachines/graalvm-ce-java16-21.1.0/Contents/Home/lib/svm/builder/llvm-platform-specific-shadowed.jar:/Library/Java/JavaVirtualMachines/graalvm-ce-java16-21.1.0/Contents/Home/lib/svm/builder/javacpp-shadowed.jar:/Library/Java/JavaVirtualMachines/graalvm-ce-java16-21.1.0/Contents/Home/lib/svm/builder/svm-llvm.jar:/Library/Java/JavaVirtualMachines/graalvm-ce-java16-21.1.0/Contents/Home/lib/svm/builder/pointsto.jar \
'com.oracle.svm.hosted.NativeImageGeneratorRunner$JDK9Plus' \
-imagecp \
/Library/Java/JavaVirtualMachines/graalvm-ce-java16-21.1.0/Contents/Home/lib/svm/library-support.jar:/Users/pe/Desktop \
-H:Path=/Users/pe/Desktop \
-H:DefaultLocale=de_CH.UTF-8 \
-H:+DumpTargetInfo \
-H:CLibraryPath=/Library/Java/JavaVirtualMachines/graalvm-ce-java16-21.1.0/Contents/Home/lib/svm/clibraries/darwin-amd64 \
'-H:Class@explicit main-class=Test' \
'-H:Name@main-class lower case as image name=test' \
]
[test:47656]    classlist:     657.40 ms,  0.96 GB
[test:47656]        (cap):   1,923.53 ms,  0.96 GB
[test:47656]        setup:   3,455.64 ms,  0.96 GB
# Building image for target platform: org.graalvm.nativeimage.Platform$DARWIN_AMD64
# Using native toolchain:
#   Name: LLVM (clang)
#   Vendor: apple
#   Version: 12.0.5
#   Target architecture: x86_64
#   Path: /usr/bin/cc
# Using CLibrary: com.oracle.svm.core.c.libc.NoLibC
[test:47656]     (clinit):     151.44 ms,  1.22 GB
# Static libraries:
#   ../../../Library/Java/JavaVirtualMachines/graalvm-ce-java16-21.1.0/Contents/Home/lib/svm/clibraries/darwin-amd64/liblibchelper.a
#   ../../../Library/Java/JavaVirtualMachines/graalvm-ce-java16-21.1.0/Contents/Home/lib/static/darwin-amd64/libnet.a
#   ../../../Library/Java/JavaVirtualMachines/graalvm-ce-java16-21.1.0/Contents/Home/lib/svm/clibraries/darwin-amd64/libdarwin.a
#   ../../../Library/Java/JavaVirtualMachines/graalvm-ce-java16-21.1.0/Contents/Home/lib/static/darwin-amd64/libnio.a
#   ../../../Library/Java/JavaVirtualMachines/graalvm-ce-java16-21.1.0/Contents/Home/lib/static/darwin-amd64/libjava.a
#   ../../../Library/Java/JavaVirtualMachines/graalvm-ce-java16-21.1.0/Contents/Home/lib/static/darwin-amd64/libfdlibm.a
#   ../../../Library/Java/JavaVirtualMachines/graalvm-ce-java16-21.1.0/Contents/Home/lib/static/darwin-amd64/libzip.a
#   ../../../Library/Java/JavaVirtualMachines/graalvm-ce-java16-21.1.0/Contents/Home/lib/svm/clibraries/darwin-amd64/libjvm.a
# Other libraries: pthread,-framework Foundation,dl,z
[test:47656]   (typeflow):   4,144.78 ms,  1.22 GB
[test:47656]    (objects):   3,725.77 ms,  1.22 GB
[test:47656]   (features):     304.95 ms,  1.22 GB
[test:47656]     analysis:   8,491.70 ms,  1.22 GB
[test:47656]     universe:     358.16 ms,  1.22 GB
[test:47656]      (parse):     765.34 ms,  1.72 GB
[test:47656]     (inline):   1,089.78 ms,  1.73 GB
[test:47656]    (compile):   5,440.15 ms,  2.36 GB
[test:47656]      compile:   7,715.80 ms,  2.36 GB
[test:47656]        image:   1,063.42 ms,  2.36 GB
[test:47656]        write:     290.79 ms,  2.36 GB
# Printing build artifacts to: test.build_artifacts.txt
[test:47656]      [total]:  22,191.38 ms,  2.36 GB
pe commented 3 years ago

Update: I just saw -Duser.country=US -Duser.language=en in the output of native-image … --verbose. So this works:

> native-image Test -Duser.country=CH -Duser.language=de
> ./test
de_CH
07.09.21
07:41

Is this the correct way and the documentation at https://www.graalvm.org/reference-manual/native-image/Resources/ is wrong?

oubidar-Abderrahim commented 3 years ago

Thank you for reporting this, we will take a look into it

oubidar-Abderrahim commented 3 years ago

This looks like 2 actual bugs. First, the class should load the default locale during build time which is de_CH in this case. the second issue is -Duser.country=US and -Duser.language=en interfering with -H:DefaultLocale=de_CH, both issues are tracked internally on GR-33683 and GR-33684

oubidar-Abderrahim commented 9 months ago

This should be fixed