我試圖使用java.util.Date
作爲輸入,然後用它創建一個查詢 - 所以我需要一個java.sql.Date
。如何將java.util.Date轉換爲java.sql.Date?
我很驚訝地發現它不能隱式地或顯式地進行轉換 - 但我甚至不知道我會怎麼做,因爲Java API對我來說還是比較新的。
我試圖使用java.util.Date
作爲輸入,然後用它創建一個查詢 - 所以我需要一個java.sql.Date
。如何將java.util.Date轉換爲java.sql.Date?
我很驚訝地發現它不能隱式地或顯式地進行轉換 - 但我甚至不知道我會怎麼做,因爲Java API對我來說還是比較新的。
java.util.Date
& java.sql.Date
與JDBC 4.2或更高版本。查詢範例爲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 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.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類假裝日期只是沒時間的,一天,但實際上確實時間的天,調整爲深夜時段。混亂?是的,舊的日期時間課程是一團糟。
算了....
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);
}
}
這不是一個明確的轉換!從Javadoc:「如果給定的毫秒值包含時間信息,驅動程序會將時間組件設置爲與零GMT相對應的默認時區(運行應用程序的Java虛擬機的時區)中的時間。」因此,無論你在java.util.Date上花費了多少時間,它將在數據類型設置爲DATE的列中作爲00:00:00插入。 – 2012-04-12 19:43:29
@David Ackerman .....這個方法返回`epochseconds`,即'1,1970年1月後的毫秒。但是如果我們想在這個日期之前存儲一個人的日期......或者像`0000-00-00作爲默認值`那樣的東西呢? – 2012-06-27 17:27:15
隨着對方的回答,你可以有時間信息的麻煩
我建議(日期有意想不到的效果比較!):
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);
如果您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個日期
方法(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;
}
這裏的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)
與此
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;
}
嘗試我用下面的代碼,請嘗試一下
DateFormat fm= new SimpleDateFormatter();
指定要 例如"DD-MM_YYYY"
或'YYYY-mm-dd'
然後使用日期的格式java日期數據類型爲
fm.format("object of java.util.date");
然後它會解析你的日期
該函數將從java日期對象返回一個轉換後的SQL日期。
public java.sql.Date convertJavaDateToSqlDate(java.util.Date date) {
return new java.sql.Date(date.getTime());
}
該函數將從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;
}
您可以使用此方法UTIL日期轉換爲SQL DATE,
DateUtilities.convertUtilDateToSql(java.util.Date)
轉換java.util.Data
到java.sql.Data
將失去小時,分鐘和秒。所以,如果可能的話,我建議你使用java.sql.Timestamp
這樣的:
prepareStatement.setTimestamp(1, new Timestamp(utilDate.getTime()));
欲瞭解更多信息,您可以檢查this question。
首先格式化您的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);
我想轉換最好的方法是:
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+"');
我是一個新手:經過大量運行這個工作。思想可能是有用的
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
我想下面的代碼工作正常。
java.util.Date utilDate = new java.util.Date();
java.sql.Date sqlDate = new java.sql.Date(utilDate);
在我從JXDatePicker(java calender)中選擇日期並將其作爲SQL日期類型存儲在數據庫中的情況下,以下工作正常。
java.sql.Date date = new java.sql.Date(pickedDate.getDate().getTime());
其中pickedDate是JXDatePicker的對象
您可以在這裏找到一個類似的問題 http://stackoverflow.com/questions/12131068/error-casting-java-util-date -into-java-sql-date – Lem 2013-10-29 09:59:51
對我來說,事實證明我並不需要轉換。在我的代碼中有一個`import java.sql。*`,覆蓋了java.util.date,因此在分配日期值時會導致麻煩,因爲日期值對於後者而言並不合適,而不是第一種。 HTH – HumanInDisguise 2015-04-28 13:36:22
@DavidAckerman你知道一個java.util.Date是一個日期*和*一天的時間,但是一個java.sql.Date只是一個日期*沒有*一天的時間? (實際上有一個時間段,但這被忽略了,這是一個類設計的一個不好的破解)在SQL中,`DATE`意味着只有日期。 – 2015-09-24 20:58:03