java.text.ParseException:java Android中不可解析的日期

java.text.ParseException:java Android中不可解析的日期,java,datetime,simpledateformat,unparseable,Java,Datetime,Simpledateformat,Unparseable,我正在从MSSQL服务器数据库中获取日期时间默认当前时间戳的结果,现在我需要解析这个日期、时间等。 数据库结果类似于2016-05-14 12:54:01.363 我只需要遍历这个datetime格式。就像我在下面做的那样 SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); try { Date date = format.parse(dateStr);

我正在从MSSQL服务器数据库中获取日期时间默认当前时间戳的结果,现在我需要解析这个日期、时间等。 数据库结果类似于2016-05-14 12:54:01.363

我只需要遍历这个datetime格式。就像我在下面做的那样

    SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
     try
    {
        Date date = format.parse(dateStr);
        SimpleDateFormat todayFormat = new SimpleDateFormat("dd");
        String dateToday = todayFormat.format(date);
        format = dateToday.equals(today) ? new SimpleDateFormat("hh:mm a") : new SimpleDateFormat("dd LLL, hh:mm a");
        String date1 = format.format(date);
        timestamp = date1.toString();
        //
    }
    catch (ParseException e)
    {
        e.printStackTrace();
    }
但我的错误是:

    java.text.ParseException: Unparseable date: "{"date":"2016-05-14 12:54:01.363000","timezone":"UTC","timezone_type":3}" (at offset 0)
在第3行,即Date-Date=format.parse(dateStr)


需要帮助

问题取决于如何构造format变量,最好使用传入模式而不是默认模式。在您的案例中(论点类似于“2016-05-14 12:54:01.363”),那么格式可能如下:

DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
Date date = format.parse(dateStr);
如果您的dataStr是由json web服务调用返回的,格式如异常中所示,那么您可以将dateStr映射到响应类型,例如,假设它被称为MyDate类

ObjectMapper mapper = new ObjectMapper();
mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"));
MyDate myDate = mapper.readValue(dateStr, MyDate.class);
Date date = myDate.getDate();
如果不知道返回类型,只需将其映射到映射类:

Map dateMap = new ObjectMapper().readValue(dateStr, Map.class);
DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
Date date = format.parse(dateMap.get("date"));
微秒 您的问题文本将输入字符串引为
2016-05-14 12:54:01.363
,但您的错误消息则相反,
2016-05-14 12:54:01.363000
。额外的三位数字为

旧的日期-时间类,如java.util.date,只能解析为(小数点后的3位为秒的小数点)。因此
SimpleDateFormat
无法处理此类输入。请截断输入字符串,或者更好地使用现代日期-时间类

java.time 更大的问题是,您使用的是最早版本的Java中过时的日期时间类。这些类已被内置在Java 8和更高版本中的框架所取代。该项目已将大部分Java.time功能重新移植到Java 6和7,并于年进一步适应Android。因此,没有理由与这些古老而臭名昭著的令人烦恼的课程

time类的粒度要细得多,解析为(秒小数的9位数)

在java.time中,类是UTC时间轴上的一个瞬间,分辨率为纳秒。
瞬间
与时间轴上的一个瞬间等效,分辨率更高的除外

有关在旧类型和java.time类型之间转换的更多信息,请参阅另一个问题

检索日期时间值作为日期时间类型 您应该以日期时间类型而不是字符串的形式从数据库中检索日期时间值。如果您的JDBC驱动程序符合JDBC 4.2(和的更新),则可以直接检索到。您可以将a视为加号an(小时、分钟和秒)

如果没有,那就退回到使用旧类型。对于日期时间,这意味着

尽量减少使用旧的java.sql类型,因为它们是java.util.Date/.Calendar等混乱的一部分。立即转换为java.time。要转换,请查找添加到旧类的新方法,例如

解析 如果必须解析该输入字符串,最简单的方法是使其符合标准格式。java.time类在解析/生成字符串时默认使用ISO 8601格式

要遵守,用“<代码> t>代码>替换中间的空间。假设这个字符串确实代表了UTC中的一个时刻,附加一个<代码> z <代码>。<代码> z <代码>为 Zulu ,这意味着UTC.

String input = "2016-05-14 12:54:01.363000";
String inputModified = input.replace( " " , "T" );
Instant instant = Instant.parse( inputModified );
时区 这个问题忽略了时区这一关键问题

最佳做法是以UTC格式存储日期时间值。更好的数据库会将传入数据调整为UTC格式。当以
java.sql.Timestamp
格式检索时,您的值以UTC格式存储,当转换为
Instant
格式时也是如此

一天中的日期和时间取决于时区。将时区(
ZoneId
)应用于您的
即时
,以获得一个时间

然后询问,以获得您所需的月份和时间

int dayOfMonth = zdt.getDayOfMonth();
如果希望一天中的时间本身作为对象,请使用类

如果您真的需要一天中的时间字符串,请使用该包

更好的是,让java.time来自动格式化文化规范,如元素的顺序,如年-月-日。最好显式指定区域设置,而不是隐式依赖JVM的当前默认区域设置,该区域设置可以在运行时更改

DateTimeFormatter timeOfDayFormatter = DateTimeFormatter.ofLocalizedTime( FormatStyle.SHORT );
timeOfDayFormatter = timeOfDayFormatter.withLocale( Locale.CANADA_FRENCH );
String output = zdt.toLocalTime().format( timeOfDayFormatter );

发布前请搜索堆栈溢出。@BasilBourque您的标记为重复并不能让我找到我的答案,因为我得到了一个不可解析日期的错误:“{”日期:“2016-05-14 12:54:01.363000”,“时区”:“UTC”,“时区类型”:3}”不是java.text.ParseException:不可解析日期:“2015-03-26 1624:32:39”你是对的,你的问题不是那个问题的重复,所以我重新打开了。但它是其他问题的重复。[B]你在第一段中引用的结果并不是真正的冒犯。你在最后遗漏了额外的三个零,这是你问题的根源。请编辑你的问题以确保正确。[C]你发布了太多的代码,不相关的代码。只有两行相关的
格式=
日期=
行。发布时,请编写一个。我已将新的SimpleDataFormat(“yyyy-MM-dd HH:MM:ss”)转换为新的SimpleDataFormat(“yyyy-MM-dd HH:MM:ss.SSS”);但是仍然得到相同的错误。为什么?@Kamran Bhatti-请确保输入的dateStr类似于“2016-05-14 12:54:01.363”,而不是类似于“{”日期“:“2016-05-14 12:54:01.363000”,“时区”:“UTC”,“时区类型”:3}”。我的数据库列显示的是2016-05-14 12:54:01.363,但dateStr显示的是“{”日期“:”2016-05-14 12:54:01.363000,“时区”:“UTC”,“时区类型”:3}”当我得到json中的列时。我不知道problem@KamranBhatti-您可以发布如何获取json字符串。但是看起来您的json响应应该映射到类类型。因此您可以使用JSO
String input = "2016-05-14 12:54:01.363000";
String inputModified = input.replace( " " , "T" );
Instant instant = Instant.parse( inputModified );
ZoneId zoneId = zoneId.of( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );
int dayOfMonth = zdt.getDayOfMonth();
LocalTime localTime = zdt.toLocalTime();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern( "hh:mm a" );
String output = zdt.format( formatter );
DateTimeFormatter timeOfDayFormatter = DateTimeFormatter.ofLocalizedTime( FormatStyle.SHORT );
timeOfDayFormatter = timeOfDayFormatter.withLocale( Locale.CANADA_FRENCH );
String output = zdt.toLocalTime().format( timeOfDayFormatter );