Java SimpleDateFormat引发ParseException:Windows上无法解析的日期,但Mac上没有

eri*_*k p 2 java simpledateformat

我有以下方法:

    public static Date convertFromWowInterface(String wowinterfaceFormat){
        Date date = null;
        try {
            SimpleDateFormat dateFormat = new SimpleDateFormat("MM-dd-yy hh:mm a");
            date = dateFormat.parse(wowinterfaceFormat);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return date;
    }
Run Code Online (Sandbox Code Playgroud)

传递的字符串格式为:

"08-11-19 07:00 AM"
Run Code Online (Sandbox Code Playgroud)

显然没有引号。现在,上述方法在我的Mac上可以正常工作,但是当我的某些用户使用该程序(在Windows上)时,他们会收到异常:

java.text.ParseException: Unparseable date: "08-11-19 07:00 AM"
        at java.base/java.text.DateFormat.parse(DateFormat.java:395)
Run Code Online (Sandbox Code Playgroud)

操作系统是否在这里有所作为?还是还有其他东西在玩?据我所知,SimpleDateFormat与输入字符串完全匹配?

Rob*_*ert 5

当我切换到其他语言环境时,我可以重现该问题。

这是我的演示程序:

import java.util.*;
import java.text.*;

public class YourCode {
    public static void main(String[] args) throws Exception {
        for (String a : args) {
            SimpleDateFormat dateFormat = new SimpleDateFormat("MM-dd-yy hh:mm a");
            Date d = dateFormat.parse(a);
            System.out.println(d);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

当我在美国英语语言环境下运行它时,它可以工作:

import java.util.*;
import java.text.*;

public class YourCode {
    public static void main(String[] args) throws Exception {
        for (String a : args) {
            SimpleDateFormat dateFormat = new SimpleDateFormat("MM-dd-yy hh:mm a");
            Date d = dateFormat.parse(a);
            System.out.println(d);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

当我切换到例如德国语言环境时,会看到一个例外,它使用24小时制,而不是AM / PM。

robert@saaz:~$ LC_ALL="en_US.UTF-8" java YourCode "08-11-19 07:00 AM" 
Sun Aug 11 07:00:00 CDT 2019
Run Code Online (Sandbox Code Playgroud)

要解决此问题,请在创建时指定语言环境SimpleDateFormat。更改

SimpleDateFormat dateFormat = new SimpleDateFormat("MM-dd-yy hh:mm a");
Run Code Online (Sandbox Code Playgroud)

SimpleDateFormat dateFormat = new SimpleDateFormat("MM-dd-yy hh:mm a", Locale.US);
Run Code Online (Sandbox Code Playgroud)

  • *“使用24小时制的德国语言环境” *这不是问题。问题是AM / PM在德语中拼写不同。运行以下语句:`System.out.println(Arrays.toString(DateFormatSymbols.getInstance(Locale.GERMANY).getAmPmStrings()))`---将显示`[vorm。,nachm。]`,表示如果输入为08-11-19 07:00 vorm,则解析将起作用。 (2认同)