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=... 并使用不同的值(COMPATCLDRSPI)来查看这些值如何影响您的输出。请参阅this answer 了解更多信息。

以上是关于DateFormatSymbols - 在 Tomcat 容器中/外部运行时的短月不同的主要内容,如果未能解决你的问题,请参考以下文章

java学习日历输出

java的日期

4-1

如何登录TOM邮箱网页版,TOM个人邮箱登录

有没有办法在 tom 7 和 tom6 中强制执行部署命令?

AJAX-php-json数组