#android #date #timezone
#Android #Дата #Часовой пояс
Вопрос:
Я сталкиваюсь со странной проблемой в программе, работающей на Android 2.1, которая мне кажется ошибкой в Android. Пожалуйста, просветите меня относительно того, что здесь происходит, поскольку я заблудился. 🙂
Следующая программа:
import java.util.*;
import java.text.*;
class TestMe {
public static void main(String[] args) {
String time = "2010-08-01T18:00:00 0000";
TimeZone tg = TimeZone.getDefault();
System.out.println(tg.getID());
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ");
try {
Date indate = formatter.parse(time);
String outdate = formatter.format(indate);
System.out.println(outdate);
formatter.setTimeZone( TimeZone.getTimeZone("UTC"));
String ooutdate = formatter.format(indate);
System.out.println(ooutdate);
formatter.setTimeZone( TimeZone.getDefault() );
Date ioutdate = formatter.parse(ooutdate);
System.out.println(formatter.format(ioutdate));
} catch( Exception e ) {
e.printStackTrace();
}
}
}
возвращает это при использовании последней версии java se на Mac:
(~) % javac -g TestMe.java amp;amp; java TestMe
Europe/Berlin
2010-08-01T20:00:00 0200
2010-08-01T18:00:00 0000
2010-08-01T20:00:00 0200
но возвращает следующее, когда я запускаю его внутри метода в моем приложении для Android на версии 2.1 :
I/System.out( 5379): ------------------------------------------------------------------
I/System.out( 5379): Europe/Berlin
I/System.out( 5379): 2010-08-01T20:00:00 0200
I/System.out( 5379): 2010-08-01T18:00:00 0100
I/System.out( 5379): 2010-08-01T18:00:00 0100
I/System.out( 5379): ------------------------------------------------------------------
Кто-нибудь знает о проблемах в этой конкретной версии Android api с разбором часового пояса и даты? Для меня это очень странная проблема, поскольку версия Android должна возвращать точно то же самое, что и версия java se, но этого не происходит.
Спасибо за любые подсказки,
Karsten
Ответ №1:
Попробуйте заменить setTimeZone("UTC")
на setTimeZone("GMT")
, возможно, это другие реализации, например, сейчас 0-меридиан по британскому летнему времени (BST) tz, что равно GMT 1.
Комментарии:
1. спасибо за предложение! Я пытался, но, к сожалению, с тем же результатом, что и раньше :/
Ответ №2:
Да, я попробовал это и получил тот же результат, что и вы. Тогда, я думаю, это ошибка.
http://code.google.com/p/android/issues/detail?id=8258 может помочь вам
Ответ №3:
Я тестировал в Windows Java и android2.3. Я получаю одинаковый результат в обоих случаях. Я думаю, что ошибки больше нет в Android 2.3. В любом случае, пожалуйста, проверьте инструкции import для Android по сравнению с инструкциями java
импорт инструкций в Android
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimeZone;
import android.app.Activity;
import android.os.Bundle;
import android.widget.Button;
import android.widget.TextView;
импорт инструкций в java
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimeZone;
Спасибо
Дипак
Комментарии:
1. да, я использую эти инструкции импорта. спасибо за ответ!
Ответ №4:
Мне удалось выполнить предполагаемое преобразование даты с использованием объекта Calendar:
try{
String time = "2010-08-01T18:00:00 0000";
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ");
Date indate = formatter.parse(time);
Calendar cal = Calendar.getInstance();
System.out.println("time right now: " cal.get(Calendar.YEAR) "-" (cal.get(Calendar.MONTH) 1) "-" cal.get(Calendar.DAY_OF_MONTH) "T" cal.get(Calendar.HOUR_OF_DAY) ":" cal.get(Calendar.MINUTE) ":" cal.get(Calendar.SECOND) "Z");
cal.setTime( indate );
System.out.println("time from date string: " cal.get(Calendar.YEAR) "-" (cal.get(Calendar.MONTH) 1) "-" cal.get(Calendar.DAY_OF_MONTH) "T" cal.get(Calendar.HOUR_OF_DAY) ":" cal.get(Calendar.MINUTE) ":" cal.get(Calendar.SECOND) "Z");
Calendar utcCal = new GregorianCalendar( TimeZone.getTimeZone("UTC"));
utcCal.setTimeInMillis( cal.getTimeInMillis() );
System.out.println("time from date string in utc: " utcCal.get(Calendar.YEAR) "-" (utcCal.get(Calendar.MONTH) 1) "-" utcCal.get(Calendar.DAY_OF_MONTH) "T" utcCal.get(Calendar.HOUR_OF_DAY) ":" utcCal.get(Calendar.MINUTE) ":" utcCal.get(Calendar.SECOND) "Z");
} catch( Exception e) {
}
Ответ №5:
Попробуйте воссоздать ваш объект SimpleDateFormat перед каждым вызовом setTimeZone () / format ().
Это исправило проблему, с которой я сталкивался при использовании обычного объекта SimpleDateFormat для форматирования набора времени, охватывающего изменение летнего времени. Если первый раз в наборе был после порогового значения летнего времени, все времена в наборе были отформатированы правильно. Если первый раз в наборе был до порогового значения летнего времени, то все времена после порогового значения летнего времени были неправильно отформатированы (т. Е. истекал один час) — и это продолжалось, даже когда я пытался вызвать setTimeZone() перед каждым вызовом format(). Вызов format().
Из этого я сделал вывод, что часовой пояс, используемый объектом SimpleDateFormat, привязан к первому вызову format(), а последующие вызовы setTimeZone () фактически игнорируются или перезаписываются (что звучит для меня как проблема Java, а не проблема Android).