Android SimpleDateFormat анализира грешно

Имам проблем с разбора на дата. В моето приложение извличам нови коментари от нашия сървър. Извлечените дълги времеви отпечатъци на епоха са правилни, но когато се опитвам да ги запазя в sqlite db, понякога последните коментари анализират датата погрешно.

SimpleDateFormat:

this.dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
this.dateFormat.setTimeZone(TimeZone.getTimeZone("GMT")); 

Разбор:

Log.v("GET COMMENT TIME A", ""+cu.getString(cu.getColumnIndex("creation_time")));
try {
    Log.v("GET COMMENT TIME B",""+dateFormat.parse(cu.getString(cu.getColumnIndex("creation_time"))));
    c.setCreation_time(dateFormat.parse(cu.getString(cu.getColumnIndex("creation_time"))));
    Log.v("GET COMMENT TIME C", ""+c.getCreation_time());
} catch (ParseException e) {}

Logcat: предишни коментари анализирани ДОБРЕ

01-13 13:01:58.009: V/GET COMMENT TIME A(10536): 2013-01-13 12:01:37
01-13 13:01:58.017: V/GET COMMENT TIME B(10536): Sun Jan 13 13:01:37 CET 2013
01-13 13:01:58.017: V/GET COMMENT TIME C(10536): Sun Jan 13 13:01:37 CET 2013

Logcat: последният коментар е анализиран ГРЕШНО:

01-13 13:01:58.064: V/GET COMMENT TIME A(10536): 2013-01-13 12:01:41
01-13 13:01:58.064: V/GET COMMENT TIME B(10536): Sun Jan 13 13:01:41 CET 2013
01-13 13:01:58.064: V/GET COMMENT TIME C(10536): Tue Jan 01 13:01:41 CET 2013

Така че, когато погледнете logcat GET COMMENT TIME B и C, можете да видите това

dateFormat.parse(cu.getString(cu.getColumnIndex("creation_time")))

първо връща коригирано анализирано време и 1 ред по-нататък анализира друго грешно време? Или защо getCreation_time() понякога връща грешно анализирана дата?

редактиране: коментарът има само getter и setters

public Date getCreation_time() {
    return creation_time;
}

public void setCreation_time(Date creationTime) {
    this.creation_time = creationTime;
}

person noxius    schedule 13.01.2013    source източник
comment
Странно поведение, но можете ли да изолирате проблема, като позволите на вашия createTime getter/setter да обработва Strings (а не Dates), след което просто да го зададете на cu.getColumnIndex("creation_time") и да оставите вашия dateFormat да анализира този съхранен низ?   -  person saschoar    schedule 15.01.2013


Отговори (1)


И така, анализирането 2 пъти на абсолютно същото String понякога дава различни резултати? Единствената причина, за която се сещам, е, че SimpleDateFormat не е безопасен за нишки.
Често ли е? Какво се случва, ако използвате променлива вместо поле за екземпляр?

DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
dateFormat.setTimeZone(TimeZone.getTimeZone("GMT")); 
Log.v("GET COMMENT TIME A", ""+cu.getString(cu.getColumnIndex("creation_time")));
try {
    Log.v("GET COMMENT TIME B",""+dateFormat.parse(cu.getString(cu.getColumnIndex("creation_time"))));
    c.setCreation_time(dateFormat.parse(cu.getString(cu.getColumnIndex("creation_time"))));
    Log.v("GET COMMENT TIME C", ""+c.getCreation_time());
} catch (ParseException e) {}
person bwt    schedule 16.01.2013
comment
аха, това може да е, ще проверя това - person noxius; 17.01.2013
comment
след използване на безопасния SimpleDateFormat проблемът не се е появил отново до ден днешен, така че приемам този отговор. Мерси! - person noxius; 19.01.2013