问题描述
我知道有很多关于如何从字符串转换为日期的主题,我使用的是'SimpleDateFormat',并且我有一个包含(年,月,日,时,分,秒,毫秒)的字符串,但是当我'm使用'SimpleDateFormat'未设置毫秒 这里的代码和输出:
import java.text.SimpleDateFormat;
import java.util.Date;
String strDate = "2020-08-27T10:06:07.413";
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS");
Date dateFormatter = formatter.parse(strDate);
System.out.println(dateFormatter);
输出:
Thu Aug 27 10:06:07 WAT 2020
我想要日期类型的结果
解决方法
Date类将时间存储为毫秒,如果查看日期对象,您会发现它实际上具有1598515567413毫秒的时间。
使用Date的toString()方法的System.out.println()欺骗了您。此方法使用“ EEE MMM dd HH:mm:ss zzz yyyy”格式来显示日期,并仅忽略所有毫秒。
如果使用格式化程序,该格式化程序的格式字符串中包含毫秒,则您会看到毫秒是正确的:
System.out.println(formatter.format(dateFormatter));
输出2020-08-27T10:06:07.413
,您可以使用:
String strDate = "2020-08-27T10:06:07.413"
DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss.SSS");
DateTime datetimeDF = formatter.parseDateTime(strDate);
String text = formatter.print(datetimeDF);
System.out.println(text);
或者您可以使用java.time
:
String strDate = "2020-08-27T10:06:07.413"
LocalDateTime ldate = LocalDateTime.parse(datetime,DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS"));
并根据需要使用对象ldate
。
更新(基于OP的comment):
您已经提到:非常感谢,我已经尝试过java.util,但是我无法使用LocalDateTime在数据库中设置日期,这就是为什么我使用Date
您必须使用PreparedStatement#setObject
将LocalDate
设置到数据库表中,例如
LocalDate localDate = LocalDate.now();
PreparedStatement st = conn.prepareStatement("INSERT INTO mytable (columnfoo) VALUES (?)");
st.setObject(1,localDate);
st.executeUpdate();
st.close();
原始答案:
下面给出的是toString
的{{1}}实现:
java.util.Date
在此实现中可以看到,它不包含public String toString() {
// "EEE MMM dd HH:mm:ss zzz yyyy";
BaseCalendar.Date date = normalize();
StringBuilder sb = new StringBuilder(28);
int index = date.getDayOfWeek();
if (index == BaseCalendar.SUNDAY) {
index = 8;
}
convertToAbbr(sb,wtb[index]).append(' '); // EEE
convertToAbbr(sb,wtb[date.getMonth() - 1 + 2 + 7]).append(' '); // MMM
CalendarUtils.sprintf0d(sb,date.getDayOfMonth(),2).append(' '); // dd
CalendarUtils.sprintf0d(sb,date.getHours(),2).append(':'); // HH
CalendarUtils.sprintf0d(sb,date.getMinutes(),2).append(':'); // mm
CalendarUtils.sprintf0d(sb,date.getSeconds(),2).append(' '); // ss
TimeZone zi = date.getZone();
if (zi != null) {
sb.append(zi.getDisplayName(date.isDaylightTime(),TimeZone.SHORT,Locale.US)); // zzz
} else {
sb.append("GMT");
}
sb.append(' ').append(date.getYear()); // yyyy
return sb.toString();
}
,因此,如果按照以下代码打印milliseconds
,则会得到date
的返回值,因此,您将不会在输出中看到Date#toString
。
milliseconds
我假设您已经知道String strDate = "2020-08-27T10:06:07.413";
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS");
Date date= formatter.parse(strDate);
System.out.println(date);
打印System.out.println(obj)
返回的字符串。
如何获得自定义格式的输出?
您有两个选择:
-
推荐选项:使用日期时间格式化程序,例如
obj.toString()
,如下所示:SimpleDateFormat
-
通过扩展
String strDate = "2020-08-27T10:06:07.413"; SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS"); Date date = formatter.parse(strDate); System.out.println(date); String dateStr = formatter.format(date); System.out.println(dateStr);
来创建自定义类,从而覆盖toString
的{{1}}实现。尽管这是一个选择,但我从不建议这样做。
最后,一条建议:
停止,使用过时且容易出错的Date
日期时间API和java.util.Date
。切换到modern java.util
日期时间API和相应的格式API(SimpleDateFormat
)。从 Trail: Date Time 了解有关现代日期时间API的更多信息。