SimpleDateFormat解析日期在某些Android设备上有所不同

我正在解析日期:

public class Consts{ public static final SimpleDateFormat DATE_FORMATTER_WITHOUT_TIME_ZONE = new SimpleDateFormat( "yyyy-MM-dd HH:mm"); public static final SimpleDateFormat DATE_FORMATTER_2 = new SimpleDateFormat( "MM-dd-yyyy HH:mm:ss ZZZZ"); } cDate = new GregorianCalendar(); sDate = new GregorianCalendar(); eDate = new GregorianCalendar(); if (mStartTimeTV.getText().toString().equals("Now")) { sDate.setTime(cDate.getTime()); } else { sDate.setTime(Consts.DATE_FORMATTER_WITHOUT_TIME_ZONE .parse(mStartTimeTV.getText().toString())); } if (!mEndTimeTV.getText().toString().equals("")) { eDate.setTime(Consts.DATE_FORMATTER_WITHOUT_TIME_ZONE .parse(mEndTimeTV.getText().toString())); } else { eDate.setTime(sDate.getTime()); // eDate = sDate; } 

然后我将日期格式化如下,然后再将其发送到服务器:

 request.addProperty("StartTime", Consts.DATE_FORMATTER_2.format(sDate.getTime())); request.addProperty("EndTime", Consts.DATE_FORMATTER_2.format(eDate.getTime())); 

但事实是,在运行4.1.2的设备上,它发送日期为:

Start Date: 03-23-2015 21:17:20 +0500 End Date : 10-23-2015 21:15:00 +0500

这会在服务器端抛出exception。

但在其他设备上,它发送日期为:

Start Date: 03-23-2015 21:12:13 GMT+05:00 End Date : 03-23-2015 21:16:00 GMT+05:00

这是必需的。

难道我做错了什么? 如何防止此问题,以便所有设备发送相同的日期。 (例如03-23-2015 21:16:00 GMT+05:00

区别在于设备上设置的不同区域设置。

要缓解区域设置差异,应在格式化日期字符串时使用特定区域设置。 以下是我的代码中的示例,解决了同样的问题:

 new SimpleDateFormat(C.FORMAT_DATETIMEZ, Locale.US).format(new Date(time)) 

您可以扩展SimpleDateFormat并覆盖其格式(…)函数,如下所示:

 public class ExSimpleDateFormat extends SimpleDateFormat{ private static final long serialVersionUID = -8275126788734707527L; public ExSimpleDateFormat() { super(); } public ExSimpleDateFormat(String string, Locale us) { super(string, us); } @Override public StringBuffer format(Date date, StringBuffer toAppendTo, java.text.FieldPosition pos) { final StringBuffer buf = super.format(date, toAppendTo, pos); buf.insert(buf.length() - 2, ':'); return buf; }; } 

并执行以下代码:

 Calendar ca = Calendar.getInstance(); ca.setTimeInMillis(System.currentTimeMillis()); ExSimpleDateFormat exSimpleDateFormat = new ExSimpleDateFormat("dd-MM-yyyy HH:mm:ss 'GMT'Z", Locale.US); exSimpleDateFormat.setTimeZone(ca.getTimeZone()); //your device timezone which can be GMT+xx:yy or GMT-xx:yy String desiredTime = exSimpleDateFormat.format(ca.getTime()); 

输出将如下:23-03-2015 23:12:52 GMT + 05:00

如果有帮助,请告诉我。 谢谢