Android разбирает время в часовом поясе по умолчанию - PullRequest
2 голосов
/ 21 ноября 2011

Я хочу проанализировать значение времени, отформатированное как "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 и обратно, чтобы оно заработало?

Ответы [ 3 ]

0 голосов
/ 28 ноября 2011

Оказывается, у моего устройства действительно были некоторые проблемы с часовыми поясами. Я попытался запустить код на некоторых других устройствах, и он работал как положено.

Я решил проблему с моим телефоном, установив TimeZone Fixer и обновив информацию о часовом поясе.

Я оставлю свой код как есть, но мне придется реализовать некоторые обходные пути, если проблема окажется более распространенной.

0 голосов
/ 29 февраля 2016

У меня была та же проблема: мне просто нужно было иметь Locale для 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());
}

надеюсь, это поможет!

0 голосов
/ 21 ноября 2011

Попробуйте это:

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 января 1970 г. 12:34:56 GMT

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...