【问题标题】:ParseException: Unparseable date in a custom method for parsing dates [duplicate]ParseException:用于解析日期的自定义方法中无法解析的日期 [重复]
【发布时间】:2019-03-19 11:29:13
【问题描述】:

我写了一个解析日期的方法。当我将以下日期作为参数2019-03-05 06:15:00 传递时,我得到一个java.text.ParseException: Unparseable date: "2019-03-05 06:15:00"

逻辑有什么问题?

public String convertDate(String val) throws ParseException {
    return "cast('" + new SimpleDateFormat("yyyy-MM-dd HH:mm:SS").format(
            new SimpleDateFormat("yyyy-MM-dd'T'HH:mm'Z'").parse(val)) + "' as ts)";
}

【问题讨论】:

  • 我建议你不要使用SimpleDateFormat。这个类是出了名的麻烦和过时。而是使用来自java.time, the modern Java date and time APIOffsetDateTimeDateTimeFormatter
  • 也不要在格式模式字符串中使用'Z' 来解析或打印Z 作为文字。 Z(读作Zulu)表示UTC,需要这样解析或打印,否则你会得到错误的结果。
  • 真正想要获得什么?似乎您正在动态生成 SQL 表达式或类似的表达式。对于绝大多数目的来说,这将比你真正需要的更复杂。见XY problem

标签: java date simpledateformat


【解决方案1】:

您正在尝试使用显然不适合的模式 yyyy-MM-dd'T'HH:mm'Z' 解析字符串 2019-03-05 06:15:00

【讨论】:

  • 我尝试传递以下字符串:2013-06-19T12:00-05:00 仍然得到java.text.ParseException: Unparseable date: "2013-06-19T12:00-05:00"
  • @samba 仍然您尝试解析的字符串与模式不匹配,请检查时间部分
  • 试试2013-06-19T12:00Z,这应该可行。
  • 定义“工作”。它不会抛出异常,但会给出不正确的结果(在大多数 JVM 上)。
【解决方案2】:

要么将方法更改为以下

public String convertDate(String val) throws ParseException {
        return "cast('" + new SimpleDateFormat("yyyy-MM-dd'T'HH:mm'Z'").format(
                new SimpleDateFormat("yyyy-MM-dd HH:mm:SS").parse(val)) + "' as ts)";
}

或通过

2019-03-05T06:15Z

【讨论】:

  • 我需要保留该方法。相反,我想了解我应该传递什么样的字符串
  • 通过 2019-03-05T06:15Z
  • 谢谢!问题是我传递的日期字符串与我的模式不兼容
  • @samba 错了! Z 是区域偏移量!不仅仅是一封信。你的模式没有反映你想要做什么。
【解决方案3】:

好吧,除了这个 SS 和更改顺序之外,您的代码没有任何问题。

秒数 55

S 秒分数 978

   public static String convertDate(String val) throws ParseException {
    return "cast('" + new SimpleDateFormat("yyyy-MM-dd'T'HH:mm'Z'").format(
            new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(val)) + "' as ts)";
}

【讨论】:

  • 我假设 T 代表 Tag(day ),Z 代表 Zeit (time)?
  • 不,@MS90。 T 代表时间(表示一天中的时间开始),Z 是“祖鲁时区”或 UTC 或 UTC 偏移量为零的军事名称。
  • 答案在这里:ISO 8601 on WikipediaZ hereT here)。当然,请等待 samba 确认。
【解决方案4】:

Z 表示区域偏移量。根据文档

Z zone-offset offset-Z +0000; -0800; -08:00;

所以你的String 应该是,例如

2019-03-05T06:15+0100

您的模式似乎没有反映您想要完成的任务。 Z 不仅仅是一个简单的字母。

yyyy-MM-dd'T'HH:mmZ

无论如何,避免使用SimpleDateFormat,改用DateTimeFormatter,这是Java 8 新时间API 的一部分。

final String val = "2019-03-05T06:15+0100";
final TemporalAccessor parse = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mmZ").parse(val);
final String format = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:SS").format(parse);

通过输入

2019-03-05T06:15+01:00

你甚至可以使用

final TemporalAccessor parsed = DateTimeFormatter.ISO_DATE_TIME.parse(val);

【讨论】:

  • @MS90 不知道。谢谢。那么希望 OP 来自德国 ;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多