我正在尝试将以下字符串"2012-04-13 04:08:42.794"
转换为日期类型:
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss.SSS");
Date convertedDate;
try {
convertedDate = dateFormat.parse(dateString);
System.out.println(" in utils: "+convertedDate.toString());
} catch (ParseException e) {
e.printStackTrace();
return null;
}
//----------------- i think this is the problem
java.sql.Date sqlDate = new java.sql.Date(convertedDate.getTime());
System.out.println("sql: "+sqlDate.toString());
return sqlDate;
但这正在打印以下内容:
in utils: Fri Apr 13 04:08:42 PDT 2012
如何获取此日期以保留毫秒数?
对象实际上包含毫秒信息。这里的问题是 toString() 方法格式不打印毫秒。
做
System.out.println(" in utils: " + dateFormat.format(convertedDate));
您还可以检查 ms 是否设置为
System.out.println("millis: " + convertedDate.getTime());
他是我的选择(试图保持与你的代码风格相同的代码风格):
import java.util.*;
import java.text.*;
public class main {
public static void main(String[] args)throws Exception {
long yourmilliseconds = 1119193190;
SimpleDateFormat sdf = new SimpleDateFormat("MMM dd,yyyy HH:mm:ss.SSS");
Date resultdate = new Date(yourmilliseconds);
System.out.println(sdf.format(resultdate)); }
}
输出:
Jan 13,1970 17:53:13.190
问候,埃瓦尔德
您可以使用自己的打印方法进行打印,而不是使用 toString() 进行打印,这样它就可以打印您想要的信息。另请注意,大多数 Date 类已弃用 - 查看 http://docs.oracle.com/javase/6/docs/api/java/util/Date.html
Calendar now = Calendar.getInstance();
System.out.println("Current milliseconds since Jan 1, 1970 are :"
+ now.getTimeInMillis());
只需使用 java.util.Calendar http://docs.oracle.com/javase/7/docs/api/java/util/Calendar.html
tl;dr
myPreparedStatetment.setObject(
… ,
LocalDateTime.parse(
"2012-04-13 04:08:42.794".replace( " " , "T" )
)
)
详
SJuan76 的答案是正确的:你被 Date::toString
方法设计不佳的输出所愚弄。相反,请使用java.time类。
java.time
现代方法使用 java.time 类,这些类取代了麻烦的旧日期时间类,例如 Date
/Calendar
。
首先转换输入字符串以完全符合 ISO 8601 标准。将中间的空格替换为T
。
String input = "2012-04-13 04:08:42.794".replace( " " , "T" ) ;
解析为LocalDateTime
,因为您的输入缺少与 UTC 或时区偏移的指示符。
LocalDateTime ldt = LocalDateTime.parse( input ) ;
ldt.toString(): 2012-04-13T04:08:42.794
.SQL
避免使用与日期时间相关的java.sql
类。它们也被java.time类所取代。从 JDBC 4.2 开始,您可以直接与数据库交换 java.time 对象。因此,您可以忘记所有关于java.sql.Date
类及其可怕的黑客设计的信息。
myPreparedStatement.setObject( … , ldt ) ;
和。。。
LocalDateTime ldt = myResultSet.getObject( … , LocalDateTime.class ) ;
道德
故事的寓意#1:使用智能对象,而不是哑字符串。
故事的寓意#2:只使用java.time对象。避免使用旧的日期时间类。
关于 java.time
java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧旧日期时间类,如java.util.Date
、Calendar
和SimpleDateFormat
。
Joda-Time 项目现在处于维护模式,建议迁移到 java.time 类。
要了解更多信息,请参阅 Oracle 教程。并搜索堆栈溢出以获取许多示例和解释。规范为 JSR 310。
使用符合 JDBC 4.2 或更高版本的 JDBC 驱动程序,您可以直接与数据库交换 java.time 对象。不需要字符串或java.sql.*类。
从哪里获得java.time类?
- Java SE
- 8、Java SE 9 及更高版本
- 内置。
- 具有捆绑实现的标准 Java API 的一部分。
- Java 9添加了一些小功能和修复。
Java SE - 6 和 Java SE 7
- 许多java.time功能在ThreeTen-Backport中向后移植到Java 6和7。
- 人造人
- java.time 类的 Android 捆绑包实现的更高版本。
- 对于早期的Android,ThreeTenABP项目适应了ThreeTen-Backport(如上所述)。请参阅如何使用ThreeTenABP...。
ThreeTen-Extra项目通过额外的类扩展了java.time。这个项目是未来可能添加到java.time的试验场。你可以在这里找到一些有用的类,如Interval
、YearWeek
、YearQuarter
等。