无法解释的日期:“2018年3月1日星期四下午12:43:38 IST”
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了无法解释的日期:“2018年3月1日星期四下午12:43:38 IST”相关的知识,希望对你有一定的参考价值。
答案
如果没有看到您的代码,很难确切地说出为什么会出现错误,但无论如何......
通常会发生解析异常,因为格式化程序/解析器类已发现问题;您使用的模式与您尝试解析的字符串不匹配,或者某些配置错误,或类似的任何内容。所以让我们看看它:
- 一周的月份和星期几是英文,所以你必须设置一个
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提供了一种解决这种歧义的方法,但您必须选择适当的区域。
About formats
最后要注意,请记住日期对象没有格式:https://codeblog.jonskeet.uk/2017/04/23/all-about-java-util-date/
将Date
,Timestamp
或任何其他日期对象保存到数据库时,您将保存其值,并且这些日期不是任何特定格式。像"Thursday 01 March 2018 12:43:38 PM IST"
这样的字符串只是日期值的表示,但并不意味着它们以该格式保存。
以上是关于无法解释的日期:“2018年3月1日星期四下午12:43:38 IST”的主要内容,如果未能解决你的问题,请参考以下文章