//有我的代码
public static void main(String[] args) {
String a = "19900416000000";
String b = "19900415000000";
DateFormat df = new SimpleDateFormat("yyyyMMddHHmmss");
df.setLenient(false);
try {
df.parse(a);
} catch (ParseException e) {
System.out.println("a parse error");
e.printStackTrace();
}
try {
df.parse(b);
}catch (ParseException e){
System.out.println("b parse error");
e.printStackTrace();
}
//我收到一个错误,比如
b parse error
java.text.ParseException: Unparseable date: "19900415000000"
at java.text.DateFormat.parse(DateFormat.java:366)
at org.suanhua.elasticsearch.client.ETLTest.main(ETLTest.java:179)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:483)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140)
那么,a和b之间的区别是什么?为什么解析(b)得到错误?
//我的导入
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
//在intellij
下使用jdk8答案 0 :(得分:5)
您的问题似乎与时区有关。
在我的jdk1.8.0_91安装中测试所有时区。
String a = "19900416000000";
String b = "19900415000000";
DateFormat df = new SimpleDateFormat("yyyyMMddHHmmss");
df.setLenient(false);
for (String id : TimeZone.getAvailableIDs()) {
df.setTimeZone(TimeZone.getTimeZone(id));
try {
df.parse(a);
} catch (ParseException e) {
System.out.println(id + ": " + e);
}
try {
df.parse(b);
} catch (ParseException e) {
System.out.println(id + ": " + e);
}
}
输出
Asia/Chongqing: java.text.ParseException: Unparseable date: "19900415000000"
Asia/Chungking: java.text.ParseException: Unparseable date: "19900415000000"
Asia/Harbin: java.text.ParseException: Unparseable date: "19900415000000"
Asia/Shanghai: java.text.ParseException: Unparseable date: "19900415000000"
PRC: java.text.ParseException: Unparseable date: "19900415000000"
CTT: java.text.ParseException: Unparseable date: "19900415000000"
如果您的默认时区是其中任何一个,那么它会失败,因为1990年4月15日午夜不存在,因为这是夏令时开始的时间,即在午夜,时钟被设置为凌晨1点,所以午夜不存在。
答案 1 :(得分:1)
FWIW,Bowie,JDK 8中较新的日期和时间类可以解析字符串并举例说明
1990-04-16T00:00+09:00[Asia/Chongqing]
1990-04-15T01:00+09:00[Asia/Chongqing]
你会注意到第二个字符串有01个小时,它在输入字符串中表示00。我喜欢(编辑:添加了dtf
的创建):
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyyMMddHHmmss");
System.out.println(LocalDateTime.parse(b, dtf)
.atZone(ZoneId.of("Asia/Chongqing")));
如果您只需要计算机的默认时区,则可以使用ZoneId.systemDefault()
。
在任何情况下,由于您使用的是JDK 8,有没有什么理由让您坚持使用过时的类SimpleDateFormat
和朋友?较新的课程通常可以更好地使用。
如果您需要捕捉夏季时间间隔的日期时间,您必须特别处理它。例如,转换回LocalDateTime
,看看你是否与你解析的那个相同。
1990-04-15T00:00+08:00[Asia/Taipei]
,即00小时,所以这里的时间是午夜0:00。对于其他5个时区,安德烈亚斯提到我得到了01个小时。