date为null并在几台设备上崩溃

时间:2016-01-28 16:43:50

标签: android 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

3 个答案:

答案 0 :(得分:4)

如果区域设置未设置为美国英语,则区域设置的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" (在   抵消15)

偏移15是AM / PM标记。因此,退出try / catch块时,日期对象将保持为空,从而在调用NullPointerException方法时导致getTime()

顺便说一下,您可以考虑使用Joda DateTime来获取Unix时代,类似于:Joda DateTime to Unix DateTime

答案 1 :(得分:0)

也许dtStart总是没有相同的格式(在这种情况下它是硬编码的)。如果在try catch块之后dtStart的格式不正确,则“date”为null,并且应用程序在最后一行崩溃,因为日期为null。 (date.getTime())

答案 2 :(得分:0)

当date为null时抛出异常。 如果无法解析dtStart,则date将为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();
}