2009-02-09 66 views
369

我試圖使用java.util.Date作爲輸入,然後用它創建一個查詢 - 所以我需要一個java.sql.Date如何將java.util.Date轉換爲java.sql.Date?

我很驚訝地發現它不能隱式地或顯式地進行轉換 - 但我甚至不知道我會怎麼做,因爲Java API對我來說還是比較新的。

+0

您可以在這裏找到一個類似的問題 http://stackoverflow.com/questions/12131068/error-casting-java-util-date -into-java-sql-date – Lem 2013-10-29 09:59:51

+0

對我來說,事實證明我並不需要轉換。在我的代碼中有一個`import java.sql。*`,覆蓋了java.util.date,因此在分配日期值時會導致麻煩,因爲日期值對於後者而言並不合適,而不是第一種。 HTH – HumanInDisguise 2015-04-28 13:36:22

+1

@DavidAckerman你知道一個java.util.Date是一個日期*和*一天的時間,但是一個java.sql.Date只是一個日期*沒有*一天的時間? (實際上有一個時間段,但這被忽略了,這是一個類設計的一個不好的破解)在SQL中,`DATE`意味着只有日期。 – 2015-09-24 20:58:03

回答

26

TL;博士

  • 使用java.time類,而不是傳統的java.util.Date & java.sql.Date與JDBC 4.2或更高版本。
  • 如果與尚未更新爲java.time的代碼進行交互操作,則轉換爲java.time。

查詢範例爲PreparedStatement

myPreparedStatement.setObject( 
    … ,           // Specify the ordinal number of which argument in SQL statement. 
    myJavaUtilDate.toInstant()     // Convert from legacy class `java.util.Date` (a moment in UTC) to a modern `java.time.Instant` (a moment in UTC). 
     .atZone(ZoneId.of("Africa/Tunis")) // Adjust from UTC to a particular time zone, to determine a date. Instantiating a `ZonedDateTime`. 
     .toLocalDate()       // Extract a date-only `java.time.LocalDate` object from the date-time `ZonedDateTime` object. 
) 

詳細

如果你想只包含日期值(無時間的天,沒有時區)工作,使用LocalDate類而不是java.util.Date

java.time

在Java 8和更高版本,與Java的早期版本捆綁在一起的麻煩舊日期,時間類已被新的取代java.time package。見Oracle Tutorial。許多功能已被移植到ThreeTen-Backport中的Java中,並進一步適用於Android中的ThreeTenABP

A SQL data typeDATE僅用於日期,沒有時間和時區。 Java從來沒有正確的類,直到Java 8中的java.time.LocalDate。讓我們通過根據特定時區獲取今天的日期來創建這樣的值(時區對於確定日期在巴黎比蒙特利爾早,例如)。

LocalDate todayLocalDate = LocalDate.now(ZoneId.of("America/Montreal")); // Use proper "continent/region" time zone names; never use 3-4 letter codes like "EST" or "IST". 

在這一點上,我們可能會完成。如果您的JDBC driver符合JDBC 4.2 spec,那麼您應該能夠通過上的LocalDate傳遞PreparedStatement以存儲到SQL DATE字段中。

myPreparedStatement.setObject(1 , localDate); 

同樣地,使用ResultSet::getObject從SQL DATE列抓取到Java LocalDate對象。在第二個參數中指定類使您的代碼爲type-safe

LocalDate localDate = ResultSet.getObject(1 , LocalDate.class); 

換句話說,這整個問題JDBC 4.2下是不相關的或更高版本。

如果您的JDBC驅動程序沒有以這種方式執行,您需要回退到轉換爲java.sql類型。

轉換爲java.sql.Date

要轉換,使用添加到舊的日期時間類的新方法。我們可以撥打java.sql.Date.valueOf(…)轉換LocalDate

java.sql.Date sqlDate = java.sql.Date.valueOf(todayLocalDate); 

並走向另一個方向。

LocalDate localDate = sqlDate.toLocalDate(); 

java.util.Date

轉換雖然你應該避免使用舊的日期時間類,你可能會被迫與現有的代碼工作時。如果是這樣,你可以轉換爲/從java.time。

遍歷Instant類,它表示UTC時間軸上的某一時刻。 Instant與想法類似於java.util.Date。但請注意,Instant的分辨率最高爲nanoseconds,而java.util.Date的分辨率僅爲milliseconds

要轉換,請使用添加到舊類中的新方法。例如,java.util.Date.from(Instant)java.util.Date::toInstant

Instant instant = myUtilDate.toInstant(); 

要確定一個日期,我們需要一個時區的上下文。對於任何特定時刻,日期因時區而異。申請ZoneId即可獲得ZonedDateTime

ZoneId zoneId = ZoneId.of ("America/Montreal"); 
ZonedDateTime zdt = ZonedDateTime.ofInstant (instant , zoneId); 
LocalDate localDate = zdt.toLocalDate(); 

†的java.sql.Date類假裝日期只是沒時間的,一天,但實際上確實時間的天,調整爲深夜時段。混亂?是的,舊的日期時間課程是一團糟。

421

算了....

public class MainClass { 

    public static void main(String[] args) { 
    java.util.Date utilDate = new java.util.Date(); 
    java.sql.Date sqlDate = new java.sql.Date(utilDate.getTime()); 
    System.out.println("utilDate:" + utilDate); 
    System.out.println("sqlDate:" + sqlDate); 

    } 

} 

解釋它。這個鏈接是http://www.java2s.com/Tutorial/Java/0040__Data-Type/ConvertfromajavautilDateObjecttoajavasqlDateObject.htm

+33

這不是一個明確的轉換!從Javadoc:「如果給定的毫秒值包含時間信息,驅動程序會將時間組件設置爲與零GMT相對應的默認時區(運行應用程序的Java虛擬機的時區)中的時間。」因此,無論你在java.util.Date上花費了多少時間,它將在數據類型設置爲DATE的列中作爲00:00:00插入。 – 2012-04-12 19:43:29

+1

@David Ackerman .....這個方法返回`epochseconds`,即'1,1970年1月後的毫秒。但是如果我們想在這個日期之前存儲一個人的日期......或者像`0000-00-00作爲默認值`那樣的東西呢? – 2012-06-27 17:27:15

36

隨着對方的回答,你可以有時間信息的麻煩

我建議(日期有意想不到的效果比較!):

java.util.Calendar cal = Calendar.getInstance(); 
java.util.Date utilDate = new java.util.Date(); // your util date 
cal.setTime(utilDate); 
cal.set(Calendar.HOUR_OF_DAY, 0); 
cal.set(Calendar.MINUTE, 0); 
cal.set(Calendar.SECOND, 0); 
cal.set(Calendar.MILLISECOND, 0);  
java.sql.Date sqlDate = new java.sql.Date(cal.getTime().getTime()); // your sql date 
System.out.println("utilDate:" + utilDate); 
System.out.println("sqlDate:" + sqlDate); 
-8

如果您usgin MySQL中的日期列可以通過該日期的字符串表示

所以我使用DateFormatter類格式化它,然後將其設置爲一個字符串在SQL語句或準備語句

這裏是代碼插圖:

private String converUtilDateToSqlDate(java.util.Date utilDate) { 
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); 
    String sqlDate = sdf.format(utilDate); 
    return sqlDate; 
} 

字符串日期= converUtilDateToSqlDate(otherTransaction.getTransDate());

//然後傳遞這個日期在你的SQL語句比較2個日期

1

方法(util.date或sql.date)

public static boolean isSameDay(Date a, Date b) { 
    Calendar calA = new GregorianCalendar(); 
    calA.setTime(a); 

    Calendar calB = new GregorianCalendar(); 
    calB.setTime(b); 

    final int yearA = calA.get(Calendar.YEAR); 
    final int monthA = calA.get(Calendar.MONTH); 
    final int dayA = calA.get(Calendar.DAY_OF_YEAR); 

    final int yearB = calB.get(Calendar.YEAR); 
    final int monthB = calB.get(Calendar.MONTH); 
    final int dayB = calB.get(Calendar.DAY_OF_YEAR); 

    return yearA == yearB && monthA == monthB && dayA == dayB; 
} 
2

這裏的Util日期轉換爲SQL日期的例子,亞這是一個例子,我在我的項目中使用可能對你也有幫助。

java.util.Date utilStartDate = table_Login.getDob();(orwhat ever date your give form obj) 
java.sql.Date sqlStartDate = new java.sql.Date(utilStartDate.getTime());(converting date) 
0

與此

public static String toMysqlDateStr(Date date) { 
    String dateForMySql = ""; 
    if (date == null) { 
     dateForMySql = null; 
    } else { 
     SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
     dateForMySql = sdf.format(date); 
    } 

    return dateForMySql; 
} 
-3

嘗試我用下面的代碼,請嘗試一下

DateFormat fm= new SimpleDateFormatter(); 

指定要 例如"DD-MM_YYYY"'YYYY-mm-dd'然後使用日期的格式java日期數據類型爲

fm.format("object of java.util.date"); 

然後它會解析你的日期

19

該函數將從java日期對象返回一個轉換後的SQL日期。

public java.sql.Date convertJavaDateToSqlDate(java.util.Date date) { 
    return new java.sql.Date(date.getTime()); 
} 
5

該函數將從java日期對象返回一個轉換後的SQL日期。

public static java.sql.Date convertFromJAVADateToSQLDate(
      java.util.Date javaDate) { 
     java.sql.Date sqlDate = null; 
     if (javaDate != null) { 
      sqlDate = new Date(javaDate.getTime()); 
     } 
     return sqlDate; 
    } 
-3

您可以使用此方法UTIL日期轉換爲SQL DATE,

DateUtilities.convertUtilDateToSql(java.util.Date) 
15

轉換java.util.Datajava.sql.Data將失去小時,分鐘和秒。所以,如果可能的話,我建議你使用java.sql.Timestamp這樣的:

prepareStatement.setTimestamp(1, new Timestamp(utilDate.getTime())); 

欲瞭解更多信息,您可以檢查this question

3

首先格式化您的java.util.Date。然後使用格式化的日期來獲得日期的java.sql.Date

java.util.Date utilDate = "Your date" 
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); 
final String stringDate= dateFormat.format(utilDate); 
final java.sql.Date sqlDate= java.sql.Date.valueOf(stringDate); 
-1

我想轉換最好的方法是:

static java.sql.Timestamp SQLDateTime(Long utilDate) { 
    return new java.sql.Timestamp(utilDate); 
} 

Date date = new Date(); 
java.sql.Timestamp dt = SQLDateTime(date.getTime()); 

如果你想在dt變量插入到SQL表你可以這樣做:

insert into table (expireAt) values ('"+dt+"'); 
1

我是一個新手:經過大量運行這個工作。思想可能是有用的

 String bufDt = bDOB.getText(); //data from form 
    DateFormat dF = new SimpleDateFormat("dd-MM-yyyy"); //data in form is in this format 
    Date bbdt = (Date)dF.parse(bufDt); // string data is converted into java util date 
    DateFormat dsF = new SimpleDateFormat("yyyy-MM-dd"); //converted date is reformatted for conversion to sql.date 
    String ndt = dsF.format(bbdt); // java util date is converted to compatible java sql date 
    java.sql.Date sqlDate= java.sql.Date.valueOf(ndt); // finally data from the form is convered to java sql. date for placing in database 
-3

我想下面的代碼工作正常。

java.util.Date utilDate = new java.util.Date();
java.sql.Date sqlDate = new java.sql.Date(utilDate);

7

在我從JXDatePicker(java calender)中選擇日期並將其作爲SQL日期類型存儲在數據庫中的情況下,以下工作正常。

java.sql.Date date = new java.sql.Date(pickedDate.getDate().getTime());

其中pickedDate是JXDatePicker的對象

相關問題