Java 日期不会在转换时使用简单的日期格式保留毫秒数



我正在尝试将以下字符串"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.DateCalendarSimpleDateFormat

Joda-Time 项目现在处于维护模式,建议迁移到 java.time 类。

要了解更多信息,请参阅 Oracle 教程。并搜索堆栈溢出以获取许多示例和解释。规范为 JSR 310。

使用符合 JDBC 4.2 或更高版本的 JDBC 驱动程序,您可以直接与数据库交换 java.time 对象。不需要字符串或java.sql.*类。

从哪里获得java.time类?

    Java SE
  • 8Java SE 9 及更高版本
    • 内置。
    • 具有捆绑实现的标准 Java API 的一部分。
    • Java 9添加了一些小功能和修复。
  • Java SE
  • 6Java SE 7
    • 许多java.time功能在ThreeTen-Backport中向后移植到Java 6和7。
  • 人造人
    • java.time 类的 Android 捆绑包实现的更高版本。
    • 对于早期的Android,ThreeTenABP项目适应了ThreeTen-Backport(如上所述)。请参阅如何使用ThreeTenABP...

ThreeTen-Extra项目通过额外的类扩展了java.time。这个项目是未来可能添加到java.time的试验场。你可以在这里找到一些有用的类,如IntervalYearWeekYearQuarter等。

相关内容

  • 没有找到相关文章

最新更新