无法解释的日期:“2018年3月1日星期四下午12:43:38 IST”

时间:2018-03-01 17:25:04

标签: java mysql timestamp datetime-parsing

"Thursday 01 March 2018 12:43:38 PM IST"作为时间戳插入MySQL时,我得到一个解析异常。

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

1 个答案:

答案 0 :(得分:0)

如果没有看到您的代码,很难确切地告诉您为什么会收到错误,但无论如何......

通常会发生解析异常,因为formatter / parser类发现了问题;您使用的模式与您尝试解析的字符串不匹配,或者某些配置错误,或类似的情况。所以,让我们看看它:

  • 一周中的某个月和星期几是英文,因此您必须设置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());

请注意,我使用&#34; Asia / Kolkata&#34; 作为时区。那些格式为&#34; Continent / City&#34; 的名称是Java使用的标准,而&#34; IST&#34; 等短名称则是模棱两可,应该避免。幸运的是,API提供了一种解决这种歧义的方法,但您必须选择适当的区域来使用。

关于格式

作为最后一点,请注意日期对象不具有以下格式:https://codeblog.jonskeet.uk/2017/04/23/all-about-java-util-date/

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