java.text.ParseException:JAVA Android中无法解析的日期

用户名

我正在从MSSQL服务器数据库获取datetime默认CURRENT_TIMESTAMP结果,现在我需要解析此日期,时间等。数据库结果类似于2016-05-14 12:54:01.363

我需要的是遍历此日期时间格式。正如我在下面做的那样。

    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);

需要帮忙!

罗勒·布尔克

微秒

您的问题的文本将输入字符串引为,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框架取代ThreeTen-Backport项目已将大部分java.time功能反向移植到Java 6和7 ,并通过ThreeTenABP进一步适用于Android 因此,没有理由与那些古老而臭名昭著的班级进行角力。

java.time类具有更精细的粒度,可解析为纳秒的小数点后9位数字)。

在java.time中,Instant类是UTC时间线上的时刻,分辨率为纳秒。“ an Instant”等效于“ an ”,java.util.Date但分辨率更高。

有关在旧类型和java.time类型之间进行转换的更多信息,请参阅我的带有图的答案到另一个问题。

检索日期时间值作为日期时间类型

您应该以日期时间类型而不是字符串的形式从数据库中检索日期时间值。如果您的JDBC驱动程序符合JDBC 4.2(JSR 221的更新,并在此处进行了描述),则您可以直接将其检索到中OffsetDateTime您可以将aOffsetDateTime视为与UTCInstant偏移量(小时,分钟和秒数)。

java.time.OffsetDateTime odt = resultSet.getObject( 1 );

如果不是,则退回到使用旧的java.sql类型。对于日期时间,这表示java.sql.Timestamp

java.sql.Timestamp ts = resultSet.getTimestamp( 1 );

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

Instant instant = ts.toInstant();

解析中

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

为了符合要求,请将中间的SPACE替换为T并且,假设此字符串确实代表UTC的时刻,请附加一个ZZ缩写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)你Instant得到ZonedDateTime

ZoneId zoneId = zoneId.of( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );

然后询问以获取所需的月份和时间。

int dayOfMonth = zdt.getDayOfMonth();

如果您希望将时间作为自己的对象,请使用LocalTime该类。

LocalTime localTime = zdt.toLocalTime();

如果您确实需要时间中的字符串,请使用java.time.format包。

DateTimeFormatter formatter = DateTimeFormatter.ofPattern( "hh:mm a" );
String output = zdt.format( formatter );

更好的是,让java.time完成自动格式化的工作。请注意使用语言环境,该语言环境确定(a)月份名称等人类语言,以及(b)文化规范,例如年月日等元素的排序。最好显式指定语言环境,而不是隐式依赖JVM当前默认的语言环境,后者可以在运行时更改。

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

java.text.ParseException:无法解析的日期:

java.text.ParseException:无法解析的日期

java.text.ParseException:无法解析的日期

java.text.ParseException:无法解析的日期

java.text.ParseException:无法解析的日期:

Java Gson java.text.ParseException:无法解析的日期

获取 java.text.ParseException:无法解析的日期:“20201116135151”

如何解决java.text.ParseException:无法解析的日期?

java.text.ParseException:无法解析的日期:“ 01:19 PM”

Gson java.text.ParseException:无法解析的日期

我收到错误java.text.ParseException:无法解析的日期

SimpleDateFormat java.text.ParseException:无法解析的日期

java.text.ParseException:无法解析字符串的日期

ParseException:Java中无法解析的日期

线程“主”中的异常java.text.ParseException:无法解析的日期

错误:java.text.ParseException:无法解析的日期,如何正确格式化日期?

java.text.ParseException:无法解析的日期:“ 2020年3月6日星期三”

java.text.ParseException:无法解析的日期:“ PDT上午09:07:31”

java.text.ParseException:无法解析的日期:yyyy-MM-dd HH:mm:ss.SSSSSS

java.text.ParseException:无法解析的日期: “周三2020年3月11日”

“ java.text.ParseException:无法解析的日期:“ 2017年6月18日,上午5:39”

JUnit4测试导致java.text.ParseException:无法解析的日期

java.text.ParseException:无法解析的日期:“ 01-02-2014”

java.text.ParseException:无法解析的日期:“ 2014-06-04”(偏移量为5)

java.text.ParseException:无法解析的日期:“ 1901-01-01 00:00:00”

java.text.parseException:无法解析的日期:2020-02-06T08:00:00

java.text.ParseException:无法解析的日期:“ 2018-05-23T06:39:37 + 0000”

java.text.ParseException:无法解析的日期:“ 1991-04-14 00:00:00”

java.text.ParseException:无法解析的日期:“ 2016年2月28日”