Nasıl java.util.Date java.sql.Date dönüştürmek için?


453

Ben bir java.util.Dategiriş olarak kullanmaya çalışıyorum ve sonra onunla bir sorgu oluşturma - bu yüzden bir ihtiyacım var java.sql.Date.

Dönüşüm örtük veya açık bir şekilde yapamayacağını bulmak için şaşırdım - ama Java API hala benim için oldukça yeni olduğu için, bunu nasıl yapacağımı bile bilmiyorum.


Benzer bir sorunu burada bulabilirsiniz stackoverflow.com/questions/12131068/…
Lem

Benim için, dönüştürmem gerekmedi. Bir yoktu import java.sql.*ikincisi ama ilk değil ile gayet tarih değerlerini atarken sorun neden dolayısıyla java.util.Date geçersiz kılma ve benim kodda. HTH
HumanInDisguise

1
@DavidAckerman Do Bir java.util.Date bir tarih olduğunu biliyoruz ve bir zaman-of-gün, ama bir java.sql.Date Sadece bir buluşma olmadan bir anda günün-? (Aslında günün bir zamanı vardır, ancak göz ardı edilir, bir sınıf tasarımının kötü bir hackidir) SQL'de DATEsadece tarih anlamına gelir.
Basil Bourque

2
Aslında '09'daki nüansların farkında değildim ve bu soru çok popüler olduğu için, kabul edilen cevabı hem daha modern hem de eksiksiz bir soruya değiştirdim. Katkılarınız için herkese teşekkürler!
David Ackerman

Yanıtlar:


89

tl; Dr.

Nasıl java.util.Date java.sql.Date dönüştürmek için?

Yapma. Her iki sınıf da modası geçmiş.

  • Kullanım java.time yerine mirası sınıfları java.util.Dateve java.sql.Datedaha sonra JDBC 4.2 veya birlikte.
  • Henüz java.time sürümüne güncellenmemiş kodla birlikte çalışılıyorsa java.time biçimine / dilinden dönüştürün.

İle örnek sorgu 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.
)

Yedekler:

  • Instantyerine java.util.Date
    İkisi UTC bir an temsil eder. ama şimdi milisaniye yerine nanosaniye ile.
  • LocalDatejava.sql.Date
    İkisi yerine, günün saati ve saat dilimi olmayan salt tarih değerini temsil eder.

ayrıntılar

Yalnızca tarih değerleriyle (günün saati, saat dilimi yok) çalışmaya çalışıyorsanız, LocalDatesınıfı kullanın java.util.Date.

Java (hem eski hem de modern) ve SQL standardında tarih-saat türleri tablosu.

java.time

Java 8 ve sonraki sürümlerinde, Java'nın ilk sürümleriyle birlikte gelen sorunlu eski tarih-saat sınıfları yeni java.time paketi tarafından desteklenmiştir . Bkz. Oracle Eğitimi . Çok işlevsellik içinde Java 6 ve 7 geri-taşındıktan ThreeTen-backport ve ayrıca içinde Android'e uyarlanmıştır ThreeTenABP .

Bir SQL veri türü DATE hiçbir zaman gün-ve saat dilimi olmayan, tarih salt olması gerekiyordu. Java java.time.LocalDate, Java 8'e kadar hiçbir zaman böyle bir sınıfa sahip olmadı †. Bugün belirli bir saat dilimine göre bugünün tarihini alarak böyle bir değer yaratalım (zaman dilimi, Paris'te Montréal'e göre daha erken yeni bir gün geçtiği için bir tarih belirlemede önemlidir. misal).

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".

Bu noktada, yapılabilir. Senin Eğer JDBC sürücüsü ile uyumlu olduğu JDBC 4.2 spec , bir geçmek mümkün olmalıdır LocalDatearacılığıyla setObjectbir üzerinde PreparedStatementSQL TARİH alanına mağazaya.

myPreparedStatement.setObject( 1 , localDate );

Benzer şekilde, ResultSet::getObjectbir SQL TARİH sütunundan bir Java LocalDatenesnesine getirmek için kullanın . Sınıfı ikinci bağımsız değişkende belirtmek, kodunuzu güvenli hale getirir .

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

Başka bir deyişle, bu sorunun tamamı JDBC 4.2 veya sonraki sürümleri altında ilgisizdir .

JDBC sürücünüz bu şekilde çalışmazsa, java.sql türlerine dönüştürmeye geri dönmeniz gerekir.

Java.sql.Date dosyasına dönüştürün

Dönüştürmek için eski tarih-saat sınıflarına eklenen yeni yöntemleri kullanın. Bir java.sql.Date.valueOf(…)dönüştürmek için arayabilirsiniz LocalDate.

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

Ve diğer yöne gidiyor.

LocalDate localDate = sqlDate.toLocalDate();

Şuradan dönüştürülüyor: java.util.Date

Eski tarih-saat sınıflarını kullanmaktan kaçınmanız gerekirken, mevcut kodla çalışırken zorlanabilirsiniz. Öyleyse, java.time biçimine / dilinden dönüştürebilirsiniz.

Üzerinden gidin InstantUTC zaman çizelgesi üzerinde bir anı temsil sınıf,. An Instant, a java.util.Date. Ama dikkat Instantetmek çözünürlüğe kadar sahiptir nanosaniye ise java.util.Datesadece sahiptir milisaniye çözünürlük.

Dönüştürmek için eski sınıflara eklenen yeni yöntemleri kullanın. Örneğin, java.util.Date.from( Instant )ve java.util.Date::toInstant.

Instant instant = myUtilDate.toInstant();

Bir tarih belirlemek için bir saat dilimi bağlamına ihtiyacımız var. Belirli bir an için, tarih tüm dünyada saat dilimine göre değişir. Bir uygula ZoneIdbir olsun ZonedDateTime.

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

† java.sql.Date sınıf yerindeymiş gibi tarih-sadece bir zaman günün-olmadan ama aslında hiç yok bir zaman günün-, bir gece yarısı zaman ayarlanır. Kafa karıştırıcı? Evet, eski tarih-saat sınıfları dağınık.


Hakkında java.time

Java.time çerçevesi daha sonra Java 8 ve yerleşiktir. Bu sınıflar zahmetli eski yerini mirası gibi tarih-saat sınıfları java.util.Date, Calendar& SimpleDateFormat.

Artık bakım modunda olan Joda-Time projesi java.time sınıflarına geçişi tavsiye ediyor .

Daha fazla bilgi için Oracle Eğiticisine bakın . Ve birçok örnek ve açıklama için Stack Overflow'da arama yapın. Spesifikasyon JSR 310'dur .

Sen değiştirebilir java.time sizin veritabanı ile doğrudan nesneleri. JDBC 4.2 veya sonraki bir sürümüyle uyumlu bir JDBC sürücüsü kullanın . Dizeye gerek yok, sınıflara gerek yok .java.sql.*

Java.time sınıflarını nereden edinebilirsiniz?

Hangi Java veya Android sürümüyle kullanılacak java.time kütüphanesinin tablosu

ThreeTen-Ekstra proje ek sınıfları ile java.time uzanır. Bu proje, java.time'a gelecekteki olası eklemeler için bir kanıt zeminidir. Burada bazı yararlı sınıfları gibi bulabilir Interval, YearWeek, YearQuarter, ve daha .


478

Boşver....

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);

  }

}

açıklıyor. Bağlantı http://www.java2s.com/Tutorial/Java/0040__Data-Type/ConvertfromajavautilDateObjecttoajavasqlDateObject.htm


34
Bu açık bir dönüşüm değil! Javadoc'tan: "Verilen milisaniye değeri zaman bilgisi içeriyorsa, sürücü zaman bileşenlerini sıfır GMT'ye karşılık gelen varsayılan saat dilimindeki (uygulamayı çalıştıran Java sanal makinesinin saat dilimi) saate ayarlar." Dolayısıyla, java.util.Date dosyanızdaki zamanınız ne olursa olsun, veri türü DATE olarak ayarlanmış bir sütuna 00:00:00 olarak eklenecektir.

1
@David Ackerman ..... bu yöntem epochsecondsie milisaniye sonra döndürür 1,JAN,1970. Ama ya bir kişinin tarihini bu tarihten önce saklamak istiyorsak .... ya da benzeri bir şey0000-00-00 as default
Arjun KP

31
Benim durumumda doğru cevap <code> java.sql.Timestamp sqlTimestamp = new java.sql.Timestamp (utilDate.getTime ()); </code>, çünkü zaman alanlarını koruyor.
Alberto de Paola

2
@ wired00 Evet, Java'nın ilk sürümleriyle birlikte gelen eski tarih-saat sınıfları , bazı kaba kesmek de dahil olmak üzere kötü tasarlanmış bir karmaşa . Mümkün olduğunda , Java 8 ve sonraki sürümlerde yeni java.time çerçevesini kullanmayı deneyin . Bu yeni sınıflar eskileri tamamlıyor. Java.time sınıfları ve eski sınıflar ileri geri dönüştürme için bazı kolaylık yöntemlerine sahiptir - JDBC sürücülerinin yeni java.time türlerini doğrudan kullanacak şekilde güncellenmesini beklerken faydalıdır.
Basil Bourque

1
@ wired00 java.time komutunun nasıl kullanılacağına ilişkin bu Sorudaki yeni Cevabımı görün . Ayrıca daha fazla örnek için StackOverflow'da arama yapın.
Basil Bourque

39

Diğer cevapla zaman bilgisi ile ilgili sorunlar yaşayabilirsiniz (tarihleri ​​beklenmedik sonuçlarla karşılaştırın!)

Öneririm:

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);

5
Veritabanında bir Tarih sütunu için java.sql.Date kullanıyorsa, o zaman bilgisi kesilir. Bence çözümü aştın.
darioo

4
Evet, belki yaptım. Bazen java.sql.Data güncel tarih ile karşılaştırmak gerekir ve imho bu en iyi yoldur. Umarım yardımcı olabilir.
mauretto

Bilginize gibi korkunç zahmetli eski tarih-saat sınıfları java.util.Date, java.util.Calendarve java.text.SimpleDateFormatşimdi mirası supplanted, java.time sonra Java 8 ve yerleşik sınıflara. Oracle'ın Öğreticisine bakın .
Basil Bourque

Tabii ki, bu konu yaklaşık 10 yıl önce, java 8 öncesi idi.
Mauretto

26

Bu işlev, java date nesnesinden dönüştürülmüş bir SQL tarihi döndürür.

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

18

Dönüştürme java.util.Dataiçin java.sql.Datasaat, dakika ve saniye kaybedeceksiniz. Bu yüzden mümkünse şöyle kullanmanızı öneririm java.sql.Timestamp:

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

Daha fazla bilgi için bu soruyu kontrol edebilirsiniz .


16

JXDatePicker (java calender) 'dan tarih ve SQL Tarih türü olarak veritabanında depolanan alma durumunda, aşağıda iyi çalışıyor ..

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

Burada pickedDate, JXDatePicker öğesinin nesnesidir


5

Bu işlev, java date nesnesinden dönüştürülmüş bir SQL tarihi döndürür.

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

Önce java.util.Date'inizi biçimlendirin. Ardından, java.sql'de tarih almak için biçimlendirilmiş tarihi kullanın.

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);

2

Burada Util Tarih Sql tarihine dönüştürme örneği ve bu benim projemde kullandığım bir örnek de size yardımcı olabilir.

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)

2

Ben bir acemi değilim: çok koştuktan sonra bu çalıştı. Düşünce faydalı olabilir

     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

Bilginize gibi korkunç zahmetli eski tarih-saat sınıfları java.util.Date, java.util.Calendarve java.text.SimpleDateFormatşimdi mirası supplanted, java.time sonra Java 8 ve yerleşik sınıflara. Oracle'ın Öğreticisine bakın .
Basil Bourque

2
java.sql.Date sqlDate = new java.sql.Date(javaDate.getTime());

Burada javaDate, java.util.Date örneğidir.


1
David Ackerman, chetan ve Tanmay kumar shaw'ın cevaplarına kıyasla yeni bir şey eklemiyor gibi görünüyor, değil mi?
Ole VV

1

2 tarihi karşılaştırma yöntemi (util.date veya 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;
}

0

bununla dene

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;
}

-1

Ben dönüştürmek için en iyi yolu olduğunu düşünüyorum:

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

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

dtDeğişkeni SQL tablosuna eklemek istiyorsanız şunları yapabilirsiniz:

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

1
Bu, esasen bir yıl önce verilen cevapla aynı görünmektedir .
Bernhard Barker

-3

aşağıdaki kodu kullanıyorum lütfen deneyin

DateFormat fm= new SimpleDateFormatter();

örneğin istediğiniz tarih biçimini belirtin "DD-MM_YYYY"veya'YYYY-mm-dd' java Tarih veri türünü şu şekilde kullanın:

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

o zaman tarihini ayrıştıracak


-3

Bu yöntemi, util tarihini sql tarihine dönüştürmek için kullanabilirsiniz,

DateUtilities.convertUtilDateToSql(java.util.Date)

Standart Java kitaplığında DateUtilities sınıfı yoktur (ve bu yöntemi hızlı bir Google aramasından bile hiçbir yerde bulamıyorum). Bu belirli bir kütüphaneden geliyorsa, o kadar çok şey söylemek ve dokümanlara bir bağlantı eklemek isteyebilirsiniz.
Bernhard Barker

-4

Ben iyi çalıştı aşağıdaki kodlama çalışıyordu.

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


-8

Mysql kullanıyorsanız, bir tarih sütununa bu tarihin Dize temsili iletilebilir

bu yüzden biçimlendirmek için DateFormatter Sınıfı kullanarak ve sonra sql deyimi veya hazırlanmış deyimi bir String olarak ayarlayın

kod örnek İşte:

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

Dize date = converUtilDateToSqlDate (otherTransaction.getTransDate ());

// sonra bu tarihi sql ifadenize iletin


14
Stackoverflow'a hoş geldiniz, cevabınıza birkaç yorum var. Soru "java.util.Date'i java.sql.Date'e dönüştürme" idi. Yapıştırdığınız kod bir java.util.Date'i yyyy-AA-gg olarak biçimlendirir. Bu aslında bu bağlamda sınırlı kullanımdır, çünkü bir dize olarak yapmak yerine java.sql.Date'i doğrudan jdbc sürücülerine geçirmelisiniz.
jontro
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.