java.text.ParseException:无法解析的日期:“01:19 PM”
我只想解析一个简单的时间! 这是我的代码:
String s = "01:19 PM"; Date time = null; DateFormat parseFormat = new SimpleDateFormat("hh:mm aa"); try { time = parseFormat.parse(s); } catch (ParseException e) { // TODO Auto-generated catch block e.printStackTrace(); }
我得到这个例外:
java.text.ParseException: Unparseable date: "01:19 PM" at java.text.DateFormat.parse(Unknown Source)
这有效:
public static void main(String[] args) throws Exception { String s = "01:19 PM"; Date time = null; DateFormat parseFormat = new SimpleDateFormat("hh:mm a", Locale.ENGLISH); System.out.println(time = parseFormat.parse(s)); }
。OUPUTS:
Thu Jan 01 13:19:00 KST 1970
模式字母a
是Am / pm标记,但它是特定于区域设置的 。 显然, AM
和PM
在英语语言环境中有效,但它们在匈牙利语语言环境中无效。
你得到ParseException
因为你有一个非英语语言环境集,并且你的语言环境PM
无效。
// This is OK, English locale, "PM" is valid in English Locale.setDefault(Locale.forLanguageTag("en")); new SimpleDateFormat("hh:mm aa").parse("01:19 PM"); // This will throw Exception, Hungarian locale, "PM" is invalid in Hungarian Locale.setDefault(Locale.forLanguageTag("hu")); new SimpleDateFormat("hh:mm aa").parse("01:19 PM");
要解决此问题,可以在构造函数中指定Locale
:
// No matter what is the default locale, this will work: new SimpleDateFormat("hh:mm aa", Locale.US).parse("01:19 PM");
LocalTime
使用LocalTime
类的现代答案。
LocalTime time = null; DateTimeFormatter parseFormatter = DateTimeFormatter.ofPattern("hh:mm a", Locale.ENGLISH); try { time = LocalTime.parse(s, parseFormatter); } catch (DateTimeParseException dtpe) { System.out.println(dtpe.getMessage()); }
这将字符串从问题01:19 PM
转换为等于13:19
。
我们仍然需要提供语言环境。 由于AM / PM标记在英语以外的其他语言环境中很难使用,我认为Locale.ENGLISH
是一个相当安全的选择。 请替换你自己的。
已经在2014年提出这个问题时,旧类Date
和SimpleDateFormat
的现代替代品已经出现,现代Java日期和时间API。 今天我认为旧课程已经过时,并热烈推荐使用现代课程。 他们通常表现出更加友好的程序员和方便的工作。
仅仅为了一个简单的小事,如果我们无法在具有无法识别AM和PM的默认语言环境的系统上给出语言环境,那么现代格式化程序将给出一个例外,消息Text '01:19 PM' could not be parsed at index 6
。 索引6是它所说的PM
,所以我们已经开始了。 是的,我知道有一种方法可以使索引脱离过时类抛出的exception,但是大多数程序员从来都不知道,因此没有使用它。
更重要的是,新的API提供了一个LocalTime
类,它为我们提供了我们想要和需要的东西:只是没有日期的时间。 这使我们能够更精确地建模数据。 由于Date
必然包括日期和时间(有时您只想要一个或另一个)这一事实导致混淆导致Stack Overflow上存在许多问题。
我认为不是"hh:mm aa"
而应该是"h:mm a"
根据官方文档,你应该使用这个格式字符串: "h:mm a"
但是你的格式字符串也是正确的,因为我没有执行代码时出错。
试试这种格式: "K:ma"
检查文档: SimpleDateFormat
另外,检查您的语言环境,您的问题似乎是特定于语言环境。
- SWT事件传播
- Java – 同步静态方法
- JPA查询MONTH / YEAR函数
- java web应用程序布局,请解释一些设计原则/模式
- NoClassDefFoundError:Selenium for ChromeDriver中的org / apache / http / HttpEntity?
- MissingFormatArgumentException错误
- 在Tapestry 5.3中链接多个选择组件(Ajax更新)
- 当代码已知时,HttpURLConnection.getResponseCode()会抛出IOException
- java.util.Calendar的子类可用于商业用途 – 即IslamicCalendar