Android在默认时区中解析时间

时间:2011-11-21 19:14:24

标签: android timezone

我想将格式为"12:34:56"的时间值(来自外部网络服务)解析为DateCalendar或我之后可以与当前时间进行比较的任何内容。

问题是在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并返回以使其正常工作?

3 个答案:

答案 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