有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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

我试图以01:20pm的格式解析时间。如果运行上述代码,则会出现以下异常:

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

至于我在SimpleDataFormat构造函数中使用的格式,我没有发现任何错误。这里出了什么问题


共 (2) 个答案

  1. # 1 楼答案

    Java中的数字和日期解析使用区域设置来指定特定于区域设置的符号。在这种情况下,被拒绝的主要是pm

    为了确认这一点,下面是一段代码,用于测试VM中所有可用的区域设置

    对于不起作用的区域设置,我很想知道为什么,所以我没有解析时间,而是格式化了一个有效的时间。必须启用UTF-8输出,但这很有趣

    真正有趣的是,除了美国变体(es_US)之外,所有的西班牙语(es)语言环境都很好。嗯

    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下午
    
  2. # 2 楼答案

    您的系统区域设置不能识别AM/PM。使用Locale这样做。比如

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

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

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