2016-01-28 2 views
2

Я использую этот код для преобразования даты времени в unixtime gmt. Он отлично работает на большинстве устройств, но в некоторых случаях он разбивается. Я не могу определить причину. Как я могу это исправить?дата пуста и сбой на нескольких устройствах

int gmtOffset = TimeZone.getDefault().getRawOffset() + TimeZone.getDefault().getDSTSavings(); 
     String dt="11-01-2016 5:8 AM"; 
     DateFormat format = new SimpleDateFormat("dd-MM-yyyy hh:mm a"); 
     format.setTimeZone(TimeZone.getTimeZone("GMT")); 
     Date date = null; 
     try { 
      date = format.parse(dt); 
      System.out.println("Date ->" + date); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     long unixtime = (date.getTime() -(gmtOffset))/1000; 

ошибка:

Fatal Exception: java.lang.NullPointerException: Attempt to invoke virtual method 'long java.util.Date.getTime()' on a null object reference 

ответ

3

Когда языковой стандарт не установлен на английский, английский маркер Am/pm может отличаться. Например, на китайском языке производитель AM/PM будет 上午/下午.

Таким образом, чтобы заставить использовать AM/PM, вы должны использовать формат даты США:

DateFormat format = new SimpleDateFormat("dd-MM-yyyy hh:mm a", Locale.US) 

Я побежал этот код, когда в локали США, и она работала хорошо. Когда я переключился на Chiense, я получил сообщение:

java.text.ParseException: Unparseable date: "11-01-2016 5:8 AM" (at offset 15)

Смещение 15 является маркером AM/PM. Таким образом, при выходе из блока объект даты останется нулевым, вызывая NullPointerException при вызове метода getTime().

Кстати, вы можете использовать Joda DateTime, чтобы получить эпоху Unix, что-то вроде строк: Joda DateTime to Unix DateTime.

+0

Удивительный. Это сработало. благодаря – jason

0

Может быть dtStart не имеет такой же формат, всегда (в данном случае это жёстко). Если формат dtStart неверен после того, как блок catch «date» имеет значение null, и приложение выйдет из строя в последней строке, потому что дата равна нулю. (date.getTime())

+0

Но тот же код отлично работает на других устройствах. Он срабатывает только в нескольких устройствах. Я имею в виду то же жестко закодированное значение – jason

+0

Не могли бы вы привести мне пример устройства, где приложение выйдет из строя? –

0

Исключение составляет бросок, когда дата равна нулю. И дата будет равна null, если dtStart не может быть проанализирован. Попробуйте вот так:

int gmtOffset = TimeZone.getDefault().getRawOffset() + TimeZone.getDefault().getDSTSavings(); 
String dtStart="11-01-2016 5:8 AM"; 
DateFormat format = new SimpleDateFormat("dd-MM-yyyy hh:mm a"); 
format.setTimeZone(TimeZone.getTimeZone("GMT")); 
Date date = null; 
long unixtime = 0; 
try { 
    date = format.parse(dtStart); 
    System.out.println("Date ->" + date); 
    unixtime = (date.getTime() -(gmtOffset))/1000; 
} catch (Exception e) { 
    e.printStackTrace(); 
} 
Смежные вопросы