Android 日期为空并且在一些设备上崩溃

Android 日期为空并且在一些设备上崩溃,android,simpledateformat,Android,Simpledateformat,我正在使用此代码将日期时间转换为unixtime gmt。它在大多数设备上运行良好,但在少数设备上崩溃。我无法确定原因。我怎样才能修好它 int gmtOffset = TimeZone.getDefault().getRawOffset() + TimeZone.getDefault().getDSTSavings(); String dt="11-01-2016 5:8 AM"; DateFormat format = new SimpleDateFormat

我正在使用此代码将日期时间转换为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

也许dtStart并不总是具有相同的格式(在本例中,它是硬编码的)。如果try-catch块“date”为null后dtStart的格式不正确,并且应用程序在最后一行崩溃,因为日期为null。(date.getTime())

当区域设置未设置为美式英语时,区域设置的Am/pm标记可能不同。例如,在中文中,AM/PM制造商将是上午/下午.

因此,要强制使用AM/PM,您需要使用美国日期格式:

DateFormat format = new SimpleDateFormat("dd-MM-yyyy hh:mm a", Locale.US)
我在美国地区运行了这段代码,效果很好。当我转到Chiense时,我得到了一个信息:

java.text.ParseException:无法解析的日期:“2016年1月11日上午5:8”(在 抵销15)

偏移量15是AM/PM标记。因此,当退出
try
/
catch
块时,date对象将保持null,导致调用
getTime()
方法时出现
NullPointerException


顺便说一下,您可能会考虑使用JoDaDATETIME来获得UNIX时代,这是沿着:.< /P>< P> >当日期为NULL时异常抛出。 如果无法解析dtStart,则日期将为null。 试着这样做:

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();
}

但同样的代码在其他设备上也可以正常工作。它只在少数设备上崩溃。我的意思是相同的硬编码值你能给我一个应用程序崩溃的设备的例子吗?