使用SimpleDateFormat解析ISO8601的日期和时间时,我遇到了一个奇怪的问题。相关代码是:
public class DateHelper
{
private static SimpleDateFormat iso8601formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ");
public static Date parseISO8601(String date) throws ParseException
{
Date result = iso8601formatter.parse(date);
return result;
}
}
输入我给它一个字符串
2010-09-06T15:30:00+02:00
作为回报,我得到一个Date对象,日期设置为2010年1月6日,时间为13:30,时区为GMT + 00:00。
编辑:我也尝试使用“2010-09-06T15:30:00 + 0200”,结果相同。
令人困惑的是,日期设置部分正确,只是月份设置错误。
问题显示在Android 1.6和Android 2.2上。
我该如何解决?
答案 0 :(得分:6)
如果您使用mm
代替MM
,则问题可以重现。
所以我怀疑问题的原因在那里,并且您没有运行您认为正在运行的代码版本。在您的问题中重新编译并重新执行代码。这是对的。
答案 1 :(得分:2)
可能不是您的问题,但由于SimpleDateFormat is not thread safe您需要将代码更改为:
public class DateHelper
{
public static Date parseISO8601(String date) throws ParseException
{
return new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ").parse(date);
}
}
答案 2 :(得分:2)
您是否正在处理ParseException?代码应该为该输入字符串抛出ParseException
不确定Android,但对于Java 6,输入字符串2010-09-06T15:30:00+02:00
无效。
+02:00
不是有效的时区
不用冒号就试试吧:
2010-09-06T15:30:00+0200
技巧(测试)是使用DateFormat格式化日期并检查创建的字符串:
System.out.println(iso8601formatter.format(new Date()));
答案 3 :(得分:1)
我创建了一个1.6项目,代码对我有用......
public class DateHelper {
private static SimpleDateFormat iso8601formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ");
public static Date parseISO8601(String date) throws ParseException {
Date result = iso8601formatter.parse(date);
return result;
}
public static String makeISO8601String(Date date) {
return iso8601formatter.format(date);
}
}
public static Date parseISO8601(String date) throws ParseException {
Date result = iso8601formatter.parse(date);
return result;
}
public static String makeISO8601String(Date date) {
return iso8601formatter.format(date);
}
对我来说,打印出来:
}public class StackOverflowTest extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
TextView textView = (TextView)this.findViewById(R.id.textView);
StringBuilder builder = new StringBuilder();
try {
String badDateString = "2010-09-06T15:30:00+0200";
Date parsedDate = DateHelper.parseISO8601(badDateString);
builder.append(badDateString).append("\n");
builder.append(parsedDate.toString()).append("\n");
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
String dateString = DateHelper.makeISO8601String(new Date());
builder.append("now="+dateString).append("\n");
textView.setText(builder.toString());
}
TextView textView = (TextView)this.findViewById(R.id.textView);
StringBuilder builder = new StringBuilder();
try {
String badDateString = "2010-09-06T15:30:00+0200";
Date parsedDate = DateHelper.parseISO8601(badDateString);
builder.append(badDateString).append("\n");
builder.append(parsedDate.toString()).append("\n");
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
String dateString = DateHelper.makeISO8601String(new Date());
builder.append("now="+dateString).append("\n");
textView.setText(builder.toString());
}
这对我来说都是正确的......
答案 4 :(得分:0)
解析第一个字符串你应该使用
public static Date parseDateFromString(String aDateString){
SimpleDateFormat inputFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssz");
Date date=null;
try {
date= inputFormat.parse(aDateString);
} catch (ParseException e) {
return null;
}
return date;
解析时区如+02:00时,它是用z而不是Z.希望它有所帮助。给你+00:00的问题我认为与你使用的语言环境有关。你应该尝试用不同的语言环境来测试它。