用hh:mmaa格式解析简单的时间

时间:2016-05-06 04:52:43

标签: java parsing time simpledateformat

DateFormat formatter = new SimpleDateFormat("hh:mmaa");
formatter.parse("01:20pm")

我正在尝试以01:20 pm的格式解析时间。如果我运行上面的代码,我会得到以下异常:

java.text.ParseException: Unparseable date: "01:20pm"
    at java.text.DateFormat.parse(DateFormat.java:366)

就我在SimpleDateFormat构造函数中放置的格式而言,我没有看到任何错误。这里出了什么问题?

2 个答案:

答案 0 :(得分:7)

您的系统区域设置无法识别AM/PM。使用Locale。像,

DateFormat formatter = new SimpleDateFormat("hh:mmaa", Locale.US);

或者,在Java 8+中,使用新的java.time API,如

LocalTime lt = LocalTime.parse("01:20pm", 
       DateTimeFormatter.ofPattern("hh:mmaa", Locale.US));

答案 1 :(得分:1)

Java中的数字和日期解析使用Locale来指定特定于语言环境的符号。在这种情况下,主要是被拒绝的pm值。

要确认这一点,下面是一段代码,用于练习VM中的所有可用语言环境。

对于不起作用的语言环境,我很想知道为什么,所以我不是解析时间而是格式化有效时间。不得不启用UTF-8输出,但看起来很有意思。

真正有趣的部分是所有西班牙语(es)语言环境,除了美国变体(es_US)都可以正常工作。嗯........

Set<String> good = new TreeSet<>();
Set<String> bad = new TreeSet<>();
for (Locale locale : Locale.getAvailableLocales()) {
    try {
        new SimpleDateFormat("hh:mmaa", locale).parse("01:20pm");
        good.add(locale.toLanguageTag());
    } catch (ParseException e) {
        bad.add(locale.toLanguageTag());
    }
}
System.out.println("Good locales: " + good);

Date time = new SimpleDateFormat("hh:mmaa", Locale.ENGLISH).parse("01:20pm");
System.out.println("Bad locales:");
for (String languageTag : bad)
    System.out.printf("  %-5s: %s%n", languageTag, new SimpleDateFormat("hh:mmaa", Locale.forLanguageTag(languageTag)).format(time));

<强>输出

Good locales: [be, be-BY, bg, bg-BG, ca, ca-ES, da, da-DK, de, de-AT, de-CH, de-DE, de-GR, de-LU, en, en-AU, en-CA, en-GB, en-IE, en-IN, en-MT, en-NZ, en-PH, en-SG, en-US, en-ZA, es, es-AR, es-BO, es-CL, es-CO, es-CR, es-CU, es-DO, es-EC, es-ES, es-GT, es-HN, es-MX, es-NI, es-PA, es-PE, es-PR, es-PY, es-SV, es-UY, es-VE, et, et-EE, fr, fr-BE, fr-CA, fr-CH, fr-FR, fr-LU, he, he-IL, hi, hr, hr-HR, id, id-ID, is, is-IS, it, it-CH, it-IT, lt, lt-LT, lv, lv-LV, mk, mk-MK, ms, ms-MY, nl, nl-BE, nl-NL, nn-NO, no, no-NO, pl, pl-PL, pt, pt-BR, pt-PT, ro, ro-RO, ru, ru-RU, sk, sk-SK, sl, sl-SI, sr, sr-BA, sr-CS, sr-Latn, sr-Latn-BA, sr-Latn-ME, sr-Latn-RS, sr-ME, sr-RS, tr, tr-TR, uk, uk-UA, und]
Bad locales:
  ar   : 01:20م
  ar-AE: 01:20م
  ar-BH: 01:20م
  ar-DZ: 01:20م
  ar-EG: 01:20م
  ar-IQ: 01:20م
  ar-JO: 01:20م
  ar-KW: 01:20م
  ar-LB: 01:20م
  ar-LY: 01:20م
  ar-MA: 01:20م
  ar-OM: 01:20م
  ar-QA: 01:20م
  ar-SA: 01:20م
  ar-SD: 01:20م
  ar-SY: 01:20م
  ar-TN: 01:20م
  ar-YE: 01:20م
  cs   : 01:20odp.
  cs-CZ: 01:20odp.
  el   : 01:20μμ
  el-CY: 01:20ΜΜ
  el-GR: 01:20μμ
  es-US: 01:20p.m.
  fi   : 01:20ip.
  fi-FI: 01:20ip.
  ga   : 01:20p.m.
  ga-IE: 01:20p.m.
  hi-IN: ०१:२०अपराह्न
  hu   : 01:20DU
  hu-HU: 01:20DU
  ja   : 01:20午後
  ja-JP: 01:20午後
  ja-JP-u-ca-japanese-x-lvariant-JP: 01:20午後
  ko   : 01:20오후
  ko-KR: 01:20오후
  mt   : 01:20WN
  mt-MT: 01:20WN
  sq   : 01:20MD
  sq-AL: 01:20MD
  sv   : 01:20em
  sv-SE: 01:20em
  th   : 01:20หลังเที่ยง
  th-TH: 01:20หลังเที่ยง
  th-TH-u-nu-thai-x-lvariant-TH: ๐๑:๒๐หลังเที่ยง
  vi   : 01:20CH
  vi-VN: 01:20CH
  zh   : 01:20下午
  zh-CN: 01:20下午
  zh-HK: 01:20下午
  zh-SG: 01:20下午
  zh-TW: 01:20下午