我想将格式为"12:34:56"
的时间值(来自外部网络服务)解析为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并返回以使其正常工作?
答案 0 :(得分:0)
事实证明我的设备确实存在时区问题。我尝试在其他一些设备上运行代码,它按预期工作。
我通过安装TimeZone Fixer并更新时区信息来解决手机问题。
我将按原样保留我的代码,但如果问题变得更常见,我将不得不实施一些解决方法。
答案 1 :(得分:0)
我遇到了同样的问题:我只需要将语言环境设置为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());
}
希望它有所帮助!
答案 2 :(得分:-1)
试试这个:
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...
对我来说,这段代码会产生:
1970年1月1日12:34:56 GMT