date 为 null 并在一些设备上崩溃

date is null and crashing on a few devices

我正在使用此代码将日期时间转换为 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: Unparseable date: "11-01-2016 5:8 AM" (at offset 15)

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

顺便说一句,您可以考虑使用 Joda DateTime 来获取 Unix 纪元,类似于:Joda DateTime to Unix DateTime.

日期为空时抛出异常。 如果无法解析 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();
}