【问题标题】:Unparseable date: "Thursday 01 March 2018 12:43:38 PM IST"无法解析的日期:“IST 2018 年 3 月 1 日星期四 12:43:38 PM”
【发布时间】:2018-08-09 20:36:24
【问题描述】:

"Thursday 01 March 2018 12:43:38 PM IST" 作为时间戳插入 MySQL 时出现解析异常。

如何将此字符串转换为插入 MySQL 时间戳列?

【问题讨论】:

  • 出现错误的代码在哪里?
  • 您可能没有指定 Locale.US 来以正确的语言解析日期和月份名称。
  • 2018 年 3 月 1 日这样的日期不是美国日期吗?
  • @ifly6 是的,但由于 OP 正在解析时区 IST(印度标准时间),因此 OP 可能正在使用具有 hi_IN(印地语)语言环境的 PC。
  • 欢迎来到 Stack Overflow。请问create a Minimal, Complete, and Verifiable example可以吗?没有它,我们就很难猜出哪里出了问题,因此我们无法真正帮助您。

标签: java mysql timestamp datetime-parsing


【解决方案1】:

如果没有看到您的代码,很难确切地知道为什么会出现错误,但无论如何...

解析异常通常是因为格式化程序/解析器类发现了问题;您使用的模式与您尝试解析的字符串不匹配,或者某些配置错误,或者类似的东西。那么让我们来看看吧:

  • 月份和星期几是英文的,所以你必须设置java.util.Locale,否则它会使用系统默认的
  • IST,正如其他人已经说过的那样,是模棱两可的:它可以指印度、以色列、爱尔兰,谁知道还有其他地方。所以你也必须选择一个合适的时区——我假设你在印度,但你可以相应地更改代码

在 Java 中,你可以这样做:

// use English locale
SimpleDateFormat sdf = new SimpleDateFormat("EEEE dd MMMM yyyy hh:mm:ss a zzz", Locale.ENGLISH);
// use India timezone
sdf.setTimeZone(TimeZone.getTimeZone("Asia/Kolkata"));

String s = "Thursday 01 March 2018 12:43:38 PM IST";
Date date = sdf.parse(s);
Timestamp timestamp = new Timestamp(date.getTime());

但是SimpleDateFormat充满了问题:https://eyalsch.wordpress.com/2009/05/29/sdf/

对于 Java 8 或更高版本,有更好的 API:

// use India timezone
Set<ZoneId> preferredZones = new HashSet<>();
preferredZones.add(ZoneId.of("Asia/Kolkata"));

// use English locale
DateTimeFormatter formatter = new DateTimeFormatterBuilder()
    .appendPattern("EEEE dd MMMM yyyy hh:mm:ss a ")
    .appendZoneText(TextStyle.SHORT, preferredZones)
    .toFormatter(Locale.ENGLISH);

String s = "Thursday 01 March 2018 12:43:38 PM IST";
ZonedDateTime zdt = ZonedDateTime.parse(s, formatter);
System.out.println(zdt);

Timestamp timestamp = Timestamp.from(zdt.toInstant());

请注意,我使用 "Asia/Kolkata" 作为时区。 "Continent/City" 格式的名称是 Java 使用的标准,而像 "IST" 这样的短名称是模棱两可的,应该避免使用。幸运的是,API 提供了一种解决这种模糊性的方法,但您必须选择合适的区域来使用。

关于格式

最后请注意,日期对象没有格式:https://codeblog.jonskeet.uk/2017/04/23/all-about-java-util-date/

当您将DateTimestamp 或任何其他日期对象保存到数据库时,您将保存它们的,而这些日期没有任何特定格式。像"Thursday 01 March 2018 12:43:38 PM IST" 这样的字符串只是日期值的表示,但这并不意味着它们以该格式保存。

【讨论】:

    猜你喜欢
    • 2012-02-13
    • 1970-01-01
    • 1970-01-01
    • 2022-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多