java.text.ParseException:不可解析的日期:";2018-05-23T06:39:37;0000“;
我正在尝试从服务器接收的java.text.ParseException:不可解析的日期:";2018-05-23T06:39:37;0000“;,java,android,date,simpledateformat,formatexception,Java,Android,Date,Simpledateformat,Formatexception,我正在尝试从服务器接收的字符串创建日期。字符串是: 2018-05-23T06:39:37+0000 因此,正确的格式应为: yyyy-MM-dd'HH:MM:ss.SSSZ 这是我的密码: String createdDate = comment.getCreatedDateTime(); SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ", Locale.US); try
字符串创建日期
。字符串是:
2018-05-23T06:39:37+0000
因此,正确的格式应为:
yyyy-MM-dd'HH:MM:ss.SSSZ
这是我的密码:
String createdDate = comment.getCreatedDateTime();
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ", Locale.US);
try {
Date parsedDate = simpleDateFormat.parse(createdDate);
createdDate = parsedDate.toString();
} catch (ParseException ex) {
ex.printStackTrace();
}
mCommentDate.setText(createdDate);
我不知道是否有任何方法可以做到这一点,因为在此之后,我想再次解析为下一种格式:
年月日hh:MM
我试图直接使用最后一种格式解析原始的字符串
,但得到了相同的异常
有什么建议吗?给定的输入日期String
格式
2018-05-23T06:39:37+0000
不正确,因此您将获得ParseException
,因为日期格式yyyy-MM-dd'T'HH:MM:ss中缺少毫秒(SSS)部分
因此,请尝试使用
2018-05-23T06:39:37.235-0530
所以下面的代码应该可以工作
String createdDate = comment.getCreatedDateTime();
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ", Locale.US);
try {
Date parsedDate = simpleDateFormat.parse(createdDate);
createdDate = parsedDate.toString();
System.out.println(parsedDate.toString());
} catch (ParseException ex) {
ex.printStackTrace();
}
mCommentDate.setText(createdDate);
好的,第一个错误(正如您所指出的)是我在原始字符串上没有毫秒
从SimpleDataFormat
中删除“SSS”后,它就像一个符咒一样工作。这是最后的代码:
String createdDate = comment.getCreatedDateTime();
SimpleDateFormat defaultDateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ", Locale.getDefault());
try {
Date parsedDate = defaultDateFormat.parse(createdDate);
SimpleDateFormat finalDateFormat = new SimpleDateFormat("dd/MM/yyyy HH:mm", Locale.getDefault());
createdDate = finalDateFormat.format(parsedDate);
} catch (ParseException ex) {
ex.printStackTrace();
}
mCommentDate.setText(createdDate);
我发现你已经从评论中得到了一些帮助,但是我建议你认真考虑一下你自己的问题,因为旧的日期课程有时很麻烦。
事实上,由于传入值具有时区
,因此需要使用来解析输入
String createdDate = "2018-05-23T06:39:37+0000";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssZ");
ZonedDateTime localDate = ZonedDateTime.parse(createdDate, formatter);
System.out.println(localDate.format(DateTimeFormatter.ofPattern("dd/MM/yyyy HH:mm")));
输出:
2018年5月23日06:39
创建另一个具有新格式的SimpleDataFormat
实例,并使用已解析的日期调用'format'方法。为什么在yyyy-MM-dd'T'HH:MM:ss.SSSZ
中有S
S?您的字符串不包含Milistory,它不是hh/MM/yyyy
,而是dd/MM/yyyy
。我的错误。我的理解是你试图用一个字符串日期创建一个日期对象,对吗?对于SDF来说,考虑将字符串解析成适当的日期对象,需要指定正确的格式格式,这在你的情况下是稍有错误的!如果得到纠正,你可以正确地获取你的日期对象……作为一个旁白,考虑扔掉长期过时和臭名昭著的麻烦代码< SimpleDateFormat <代码>和朋友,并添加到你的Android项目中,以便使用<代码> java.时间>代码>,java java日期和时间API。和你一起工作真是太好了<代码>OffsetDateTime.parse(“2018-05-23T06:39:37+0000”,模式的日期时间格式(“uuu-MM-dd'T'HH:MM:ssxx”))
。我不认为OP可以改变输入值。@notyou:我不明白你想说什么,OP得到的值是这样的2018-05-23T06:39:37+0000
,但你说使用2018-05-23T06:39:37.235-0530
,但我想他们不能改变这个值。@notyou:我刚刚举了一个2018-05-23T06:39:37.235-0530的例子(这里-0530提到IST时区)。但是2018-05-23T06:39:37.000+0000(GST时区)也会很好地工作。@notyou:无论如何,我没有改变他对代码的输入。Android API 26需要使用ZoneDateTime
,但我会为其他项目保留。谢谢你的建议。同样的功能也适用于较低级别的Android,因为java.time
的类已经进行了后端口。你需要的是e安卓版的backport。更多信息。变量名localDate
在这里似乎很不幸。代码早期版本的遗留问题?@OleV.V.是的-请随意更改变量名-它来自我已经使用过的类似代码。