问题复现
import org.joda.time.LocalDate;
import org.joda.time.format.DateTimeFormat;
public class JodaTest {
public static void main(String[] args) {
String strDate = "2024-04-11";
LocalDate parse = LocalDate.parse(strDate, DateTimeFormat.shortDate());
System.out.println(parse);
}
}
以上代码在阿里云物理机上 ,第7行会报如下异常:
java.lang.IllegalArgumentException: Invalid format: "2024-04-11" is malformed at "24-04-11"
at org.joda.time.format.DateTimeFormatter.parseLocalDateTime(DateTimeFormatter.java:900)
at org.joda.time.format.DateTimeFormatter.parseLocalDate(DateTimeFormatter.java:844)
at org.joda.time.LocalDate.parse(LocalDate.java:179)
问题原因
在 Joda-Time 中,本地化(Localization)是指根据不同的地区或语言环境来调整日期和时间的显示格式。Joda-Time 支持本地化,允许你根据用户的地区设置以及你的应用程序的需求来自动调整日期和时间的格式。
默认情况下,Joda-Time 的 DateTimeFormat.shortDate() 使用本地化的默认短日期格式。这种默认格式会受到 Java 虚拟机的默认地区设置的影响。Java 的默认地区设置通常取决于操作系统的地区设置,或者可以在启动 Java 程序时通过设置 user.language 和 user.country 系统属性来指定。
在大多数情况下,用户不需要特别关心本地化设置,因为 Joda-Time 会尽可能根据系统的默认设置进行调整。然而,如果你希望显式指定日期格式或确保不受本地化的影响,可以使用固定的格式化器,例如 DateTimeFormat.forPattern("yyyy-MM-dd")。
验证
LocalDate currentDate = new LocalDate();
String formattedDate = DateTimeFormat.shortDate().print(currentDate);
logger.info("Localized Short Date Format : " + formattedDate);
以上代码,分别在阿里云服务器和本地执行,发现 这二个环境输出的格式不一样。所以在阿里云服务器上才会报错 is malformed at "24-04-11"。
本地 Localized Short Date Format : 24-4-11
阿里云 Localized Short Date Format : 4/11/24