簡體   English   中英

使用簡單的日期格式轉換時Java日期不會保留毫秒數

[英]Java date is not preserving milliseconds in conversion with simple date format

我正在嘗試將以下字符串"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

我怎樣才能得到這個日期以保持毫秒?

convertedDate對象確實包含毫秒信息。 這里的問題是toString()方法格式不打印毫秒。

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

您還可以檢查是否設置了ms

 System.out.println("millis: " + convertedDate.getTime());
 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

他是我的(嘗試保持與你的代碼風格相同):

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

此致,Erwald

您可以創建自己的打印方法,而不是使用toString()打印,因此它會打印您想要的信息。 另請注意,大多數Date類都已棄用 - 請查看http://docs.oracle.com/javase/6/docs/api/java/util/Date.html

TL;博士

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替換中間的SPACE。

String input = "2012-04-13 04:08:42.794".replace( " " , "T" ) ;

解析為LocalDateTime因為您的輸入缺少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教程 並搜索Stack Overflow以獲取許多示例和解釋。 規范是JSR 310

使用符合JDBC 4.2或更高版本的JDBC驅動程序 ,您可以直接與數據庫交換java.time對象。 不需要字符串也不需要java.sql。*類。

從哪里獲取java.time類?

ThreeTen-Extra項目使用其他類擴展了java.time。 該項目是未來可能添加到java.time的試驗場。 您可以在這里找到一些有用的類,比如IntervalYearWeekYearQuarter ,和更多

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM