当小时为 12 时,SimpleDateFormat 转换日期不正确 return 值
SimpleDateFormat convert date incorrect return value when hour is 12
我在将 json 文件中的日期转换为时间戳时遇到问题。当小时 = 12 时,返回的时间戳不正确。
Java 版本 1.8.0_171
使用下面的代码片段,我希望输出为
2017-07-19 07:43:42.0
2017-07-18 08:43:42.0
2017-07-19 09:43:42.0
相反,我得到
2017-07-19 07:43:42.0
2017-07-18 20:43:42.0
2017-07-19 09:43:42.0
我试过2台机器,有一个同事运行,结果一样
任何人都可以看到问题是什么吗?我大概在看
import java.sql.Timestamp;
import java.text.SimpleDateFormat;
import java.util.Locale;
import org.apache.commons.lang3.StringUtils;
public class TimestampTest {
public static void main(String[] args) {
String input = "2017-07-19T11:43:42.000+0000";
System.out.println(stringToTimestamp(input));
input = "2017-07-19T12:43:42.000+0000";
System.out.println(stringToTimestamp(input));
input = "2017-07-19T13:43:42.000+0000";
System.out.println(stringToTimestamp(input));
}
private static Timestamp stringToTimestamp(String input) {
try {
if(StringUtils.isBlank(input)) {
return null;
}
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'hh:mm:ss.SSSZ",
Locale.getDefault());
java.util.Date parsedDate = dateFormat.parse(input);
Timestamp timestamp = new java.sql.Timestamp(parsedDate.getTime());
return timestamp;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
除了你不应该再使用 Date
or SimpleDateFormat
之外,你的错误是因为你使用的是 hh
而不是 HH
h -> Hour in am/pm (1-12)
H -> Hour in day (0-23)
考虑在您的情况下使用 LocalDateTime。
发生这种情况是因为您使用的是默认情况下宽松的 SimpleDateFormat
。如果您通过设置 setLenient(false)
关闭宽大处理:
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'hh:mm:ss.SSSZ", Locale.getDefault());
dateFormat.setLenient(false);
你会得到一个例外:
java.text.ParseException: Unparseable date: "2017-07-19T13:43:42.000+0000"
这里的根本原因是您要提交 13
几个小时,这需要 HH
模式而不是 hh
。由于宽大处理,您的代码会默默地修复日期而不是抛出异常。
H Hour in day (0-23)
h Hour in am/pm (1-12)
我在将 json 文件中的日期转换为时间戳时遇到问题。当小时 = 12 时,返回的时间戳不正确。
Java 版本 1.8.0_171
使用下面的代码片段,我希望输出为
2017-07-19 07:43:42.0
2017-07-18 08:43:42.0
2017-07-19 09:43:42.0
相反,我得到
2017-07-19 07:43:42.0
2017-07-18 20:43:42.0
2017-07-19 09:43:42.0
我试过2台机器,有一个同事运行,结果一样 任何人都可以看到问题是什么吗?我大概在看
import java.sql.Timestamp;
import java.text.SimpleDateFormat;
import java.util.Locale;
import org.apache.commons.lang3.StringUtils;
public class TimestampTest {
public static void main(String[] args) {
String input = "2017-07-19T11:43:42.000+0000";
System.out.println(stringToTimestamp(input));
input = "2017-07-19T12:43:42.000+0000";
System.out.println(stringToTimestamp(input));
input = "2017-07-19T13:43:42.000+0000";
System.out.println(stringToTimestamp(input));
}
private static Timestamp stringToTimestamp(String input) {
try {
if(StringUtils.isBlank(input)) {
return null;
}
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'hh:mm:ss.SSSZ",
Locale.getDefault());
java.util.Date parsedDate = dateFormat.parse(input);
Timestamp timestamp = new java.sql.Timestamp(parsedDate.getTime());
return timestamp;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
除了你不应该再使用 Date
or SimpleDateFormat
之外,你的错误是因为你使用的是 hh
而不是 HH
h -> Hour in am/pm (1-12)
H -> Hour in day (0-23)
考虑在您的情况下使用 LocalDateTime。
发生这种情况是因为您使用的是默认情况下宽松的 SimpleDateFormat
。如果您通过设置 setLenient(false)
关闭宽大处理:
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'hh:mm:ss.SSSZ", Locale.getDefault());
dateFormat.setLenient(false);
你会得到一个例外:
java.text.ParseException: Unparseable date: "2017-07-19T13:43:42.000+0000"
这里的根本原因是您要提交 13
几个小时,这需要 HH
模式而不是 hh
。由于宽大处理,您的代码会默默地修复日期而不是抛出异常。
H Hour in day (0-23)
h Hour in am/pm (1-12)