将字符串转换为以毫秒为单位的日期

问题描述

我知道有很多关于如何从字符串转换为日期的主题,我使用的是'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#setObjectLocalDate设置到数据库表中,例如

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)返回的字符串。

如何获得自定义格式的输出?

您有两个选择:

  1. 推荐选项:使用日期时间格式化程序,例如obj.toString(),如下所示:

    SimpleDateFormat
  2. 通过扩展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的更多信息。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...