DateFormatSymbols - 在 Tomcat 容器中/外部运行时的短月不同
Posted
技术标签:
【中文标题】DateFormatSymbols - 在 Tomcat 容器中/外部运行时的短月不同【英文标题】:DateFormatSymbols - shortMonths different when running in/outside Tomcat container 【发布时间】:2021-07-13 14:12:35 【问题描述】:我正在读取 Excel 文件并尝试完全按照 Excel 中所示的方式输出测试,即显示文本而不是基础原始值。
为此,我使用 DataFormatter 如下:
DataFormatter formatter = new DataFormatter();
String displayValue = formatter.formatCellValue(cell);
问题是,我为这个电子表格获得的 displayValue 会根据我是否在 Tomcat 中运行 POI 代码而改变。 在 Tomcat 外部(在 UnitTest 中),显示的文本为:“29-Apr-21” 在我的 Tomcat Webapp 中运行时,提取的值为“29-Apr.-21”
我可以看到
org.apache.poi.ss.usermodel.DataFormatter
对象,有一个名为 'dateSymbols' 类型的成员变量 java.text.DateFormatSymbols
这有一个成员数组“shortMonths”,其中缩写的月份在 Tomcat 的情况下有句点,但在 UnitTest 中运行时没有。
我的第一个怀疑是存在一些环境区域设置差异,但在这两种情况下 formatter.locale = "en_AU" . 还有哪些环境差异可能导致使用不同的月份缩写?
【问题讨论】:
【参考方案1】:如果你这样做
DataFormatter formatter = new DataFormatter();
然后DataFormatter
使用环境语言环境。这在不同的环境中可能会有所不同。
如果您总是想要相同的结果,您应该使用给定的语言环境构造DataFormatter
。例如:
DataFormatter dataFormatter = new DataFormatter(new java.util.Locale("en", "AU"));
当Excel
数字格式为DD-MMM-YY
时,这总是会导致结果“29-Apr-21”。
如果使用德语语言环境,例如:
DataFormatter dataFormatter = new DataFormatter(new java.util.Locale("de", "DE"));
那么这将导致“29-Apr.-21”。
【讨论】:
正如我的问题所述,DataFormatter 的默认语言环境在这两种情况下都是 en_AU,因此其他一些环境差异正在影响 shortMonths 格式。将语言环境显式设置为 en_AU 没有区别【参考方案2】:我正在回答这个问题,以防它对任何人有所帮助,因为这肯定是一个意外的发现。
这里的环境区别在于使用了不同的JVM。
使用标准 Oracle Java 1.8 JDK 会产生不带句点的 shortMonth 值,例如“四月” 对 OpenJDK DCEVM-11.0.7+4 使用相同的代码会导致 shortMonth 值不带句点,例如“四月”再次强调,Locale
在两种情况下都是相同的 - 即使检查这些值也会在两种情况下产生相同的结果:
System.out.println(locale.getDisplayVariant());
System.out.println(locale.getDisplayLanguage());
System.out.println(locale.getLanguage());
System.out.println(locale.getDisplayName());
System.out.println(locale.getCountry());
System.out.println(locale.getVariant());
我不确定这是否被视为 DCEVM 中的“错误”,但这是人们应该知道的。
【讨论】:
一个建议:Java 8 和 Java 11 之间关于 JVM 使用哪个语言环境数据提供者(即它从哪些数据文件加载其语言环境参考数据)发生了变化。您可能想尝试使用-Djava.locale.providers=...
并使用不同的值(COMPAT
、CLDR
、SPI
)来查看这些值如何影响您的输出。请参阅this answer 了解更多信息。以上是关于DateFormatSymbols - 在 Tomcat 容器中/外部运行时的短月不同的主要内容,如果未能解决你的问题,请参考以下文章