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