【问题标题】:Java date is not preserving milliseconds in conversion with simple date formatJava 日期不保留毫秒转换为简单的日期格式
【发布时间】:2012-04-13 23:13:00
【问题描述】:

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

如何获取此日期以保留毫秒数?

【问题讨论】:

标签: java date simpledateformat


【解决方案1】:

convertedDate 对象实际上包含毫秒信息。这里的问题是 toString() 方法格式不打印毫秒。

 System.out.println(" in utils: " + dateFormat.format(convertedDate));

你也可以检查ms是否设置了

 System.out.println("millis: " + convertedDate.getTime());

【讨论】:

  • 我认为问题在于我转换为sql日期。这会摆脱毫秒吗?
  • 不,DateFormat.parse() 返回 java.util.Date,而不是 java.sql.Date。发生的事情是java.util.Date.toString() 使用的格式不显示毫秒,但数据在对象中。做我在回答中告诉你的打印,你会看到毫秒信息。 docs.oracle.com/javase/6/docs/api/java/text/…
【解决方案2】:

他是我的目标(尽量保持与您相同的代码风格):

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

问候,厄瓦尔德

【讨论】:

    【解决方案3】:

    您可以创建自己的打印方法,而不是使用 toString() 打印,因此它会专门打印您想要的信息。另请注意,大多数 Date 类已被弃用 - 查看http://docs.oracle.com/javase/6/docs/api/java/util/Date.html

    【讨论】:

      【解决方案4】:
       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

      【讨论】:

        【解决方案5】:

        tl;博士

        myPreparedStatetment.setObject( 
            … ,
            LocalDateTime.parse(
                "2012-04-13 04:08:42.794".replace( " " , "T" )
            )
        )
        

        详情

        Answer by 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 及更高版本中。这些类取代了麻烦的旧 legacy 日期时间类,例如 java.util.DateCalendarSimpleDateFormat

        Joda-Time 项目现在位于maintenance mode,建议迁移到java.time 类。

        要了解更多信息,请参阅Oracle Tutorial。并在 Stack Overflow 上搜索许多示例和解释。规格为JSR 310

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

        从哪里获得 java.time 类?

        ThreeTen-Extra 项目通过附加类扩展了 java.time。该项目是未来可能添加到 java.time 的试验场。您可以在这里找到一些有用的类,例如IntervalYearWeekYearQuartermore

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-12-24
          • 1970-01-01
          相关资源
          最近更新 更多