我想解析一个格式化为"12:34:56"
的时间值,它来自外部web服务,Date
, Calendar
或任何我可以稍后与当前时间进行比较的东西。
问题是,在Android上,DateFormat.parse
似乎忽略了用户的默认时区和解析值,如果它是在UTC。给定以下代码:
DateFormat timeFormat = new SimpleDateFormat("HH:mm:ss");
String inTime = "12:34:56";
Date time = timeFormat.parse(inTime);
Date now = new Date();
我在我的桌面(Java 1.6.0_29)上得到了想要的结果:
Thu Jan 01 12:34:56 CET 1970
Mon Nov 21 20:53:04 CET 2011
换句话说,字符串"12:34:56"在默认时区中被解析。然而,在Android上,这似乎在UTC中被解析,因为它是一个小时:
Thu Jan 01 11:34:56 GMT+0100 1970
Mon Nov 21 20:53:02 GMT+0100 2011
我甚至尝试使用timeFormat.setTimeZone(TimeZone.getDefault())
设置时区,但这没有帮助。是否有任何方法强制DateFormat.parse
在Android上的默认(用户)时区解析时间,或者我必须将所有内容转换为UTC并返回以使其工作?
原来我的设备在设置时区时确实有些问题。我试着在其他设备上运行代码,结果和预期的一样。
我通过安装TimeZone Fixer和更新时区信息解决了我手机的问题。
我将保留我的代码,但如果问题变得更常见,我将不得不实现一些变通方法。
我遇到了同样的问题:我只需要将区域设置设置为dateFormatter。以下是我所做的:
public static String getDateAsString(long milliSeconds, String dateFormat)
{
// Create a DateFormatter object for displaying date in specified format.
SimpleDateFormat formatter = new SimpleDateFormat(dateFormat, Locale.getDefault());
// Create a calendar object that will convert the date and time value in milliseconds to date.
Calendar calendar = Calendar.getInstance();
TimeZone tz = calendar.getTimeZone();
Date date = new Date(milliSeconds);
calendar.setTime(date);
calendar.setTimeZone(tz);
return formatter.format(calendar.getTime());
}
试试这个:
Date time = null;
try {
DateFormat timeFormat = new SimpleDateFormat("HH:mm:ss");
timeFormat.setTimeZone(TimeZone.getTimeZone("UTC")); // Add this. "GMT" works too.
String inTime = "12:34:56";
time = timeFormat.parse(inTime);
}
catch (ParseException e) {
e.printStackTrace();
return;
}
// and print with:
Log.e("Test", "TIIIIME: " + time.toGMTString()); // Not toString...
对我来说,这段代码产生:
1 Jan 1970 12:34:56 GMT