我正在开发一款Android应用,可以处理来自很多报纸的日期,并处理很多日期格式。我几乎正在进行非常手动的解析,但令人惊讶的是,当我在ICS设备上尝试应用程序时,当我在JB中执行此操作时,我没有相同的结果。 当我构造一个我从一些从XMls解析的字符串中调用new的对象时,会发生有问题的解析
public class NewNew implements Parcelable, Comparable<NewNew>{
private String title;
private String link;
private String description;
private Date pubDate;
private String img;
private String country;
public NewNew (String t, String l, String d, String f, String i, String c)
{
this.title= t;
this.link = l;
this.description = d;
//convert string to date
Date date = toDate(f) ;
this.pubDate= date;
this.img=i;
this.country=c;
}
public Date toDate (String dateText)
{
Date d=null;
//Sat, 03 Aug 2013 17:06:30 +0000 that is the value of dateText
SimpleDateFormat df5 = new SimpleDateFormat("dd MMM yyyy HH:mm:ss Z", Locale.getDefault());
d = df5.parse(dateText.substring(5));
return d;
}
}
非常令人惊讶的是,它在ICS中生成了一个Date对象,但在JB设备中却没有。我试图改变设备配置(手动或自动设置时区和时间,它没有任何区别)
不确定是否相关,但ICS版本是4.0.4和JB 4.3
我把它解决了 用定义的Locale替换SimpleDateFormat的构造函数中的Locale.getDefault(),在我的例子中是Locale.US。这不是我想要的,但是一旦我构建了Date对象,我就可以在SimpleDateFormat中手动创建模式
TextView dateTextView = (TextView)findViewById(R.id.dateTextView);
SimpleDateFormat sdf = new SimpleDateFormat("dd MMMM, HH:mm");
dateTextView.setText(sdf.format(d);
此外,XML pubDate格式存在一些解析错误。即使你没有看到它们被写下来,如果你被暗示,你会注意到它们上面有一些html / n或/ t的日期。我使用以下代码删除它们
public String stripHtml(String html) {
SpannableStringBuilder spannedStr = (SpannableStringBuilder) Html
.fromHtml(html.trim());
Object[] spannedObjects = spannedStr.getSpans(0, spannedStr.length(),
Object.class);
for (int i = 0; i < spannedObjects.length; i++) {
if (spannedObjects[i] instanceof ImageSpan) {
ImageSpan imageSpan = (ImageSpan) spannedObjects[i];
spannedStr.replace(spannedStr.getSpanStart(imageSpan),
spannedStr.getSpanEnd(imageSpan), "");
}
}
String textWeb = spannedStr.toString();
return Html.fromHtml(textWeb).toString();
}
在尝试将其解析为Date
之前,我将此方法应用于文本解析表单XML