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