Jawaban:
Oleh Timestamp, saya kira Anda maksud java.sql.Timestamp. Anda akan melihat bahwa kelas ini memiliki konstruktor yang menerima longargumen. Anda dapat mengurai ini menggunakan DateFormatkelas:
DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
Date date = dateFormat.parse("23/09/2007");
long time = date.getTime();
new Timestamp(time);
java.util.Date, java.util.Calendar, dan java.text.SimpleDateFormatsekarang warisan , digantikan oleh java.time kelas dibangun ke Jawa 8 dan kemudian. Lihat Tutorial oleh Oracle .
Bagaimana dengan ini?
java.sql.Timestamp timestamp = java.sql.Timestamp.valueOf("2007-09-23 10:10:10.0");
Apa maksudmu cap waktu? Jika yang Anda maksud adalah milidetik sejak zaman Unix:
GregorianCalendar cal = new GregorianCalendar(2007, 9 - 1, 23);
long millis = cal.getTimeInMillis();
Jika Anda menginginkan objek java.sql.Timestamp sebenarnya:
Timestamp ts = new Timestamp(millis);
Calendar.SEPTEMBER
java.sql.Timestamp.from (
LocalDate.of ( 2007 , 9 , 23 )
.atStartOfDay( ZoneId.of ( "America/Montreal" ) )
.toInstant()
)
Mari perbarui halaman ini dengan menunjukkan kode menggunakan framework java.time yang dibangun ke dalam Java 8 dan yang lebih baru.
Kelas-kelas baru ini terinspirasi oleh Joda-Time , ditentukan oleh JSR 310 , dan diperpanjang oleh ThreeTen-Extra . Mereka menggantikan kelas tanggal-waktu lama yang terkenal merepotkan yang dibundel dengan versi awal Java.
Di java.time, sebuah Instantmomen di timeline dalam UTC. A ZonedDateTimeadalah Sekejap yang disesuaikan dengan zona waktu ( ZoneId).
Zona waktu sangat penting di sini. Tanggal September 23, 2007tidak dapat diterjemahkan menjadi momen di garis waktu tanpa menerapkan zona waktu. Pertimbangkan bahwa hari baru terbit lebih awal di Paris daripada di Montréal yang masih “kemarin”.
Selain itu, java.sql.Timestamp mewakili tanggal dan waktu. Jadi kita harus memasukkan waktu hari untuk mengikuti tanggal. Kami berasumsi bahwa Anda menginginkan momen pertama hari itu sebagai waktu dalam sehari. Perhatikan bahwa ini tidak selalu merupakan waktu00:00:00.0 karena Daylight Saving Time dan kemungkinan anomali lainnya.
Perhatikan bahwa tidak seperti kelas java.util.Date lama, dan tidak seperti Joda-Time, jenis java.time memiliki resolusi nanodetik daripada milidetik. Ini cocok dengan resolusi java.sql.Timestamp.
Perhatikan bahwa java.sql.Timestamp memiliki kebiasaan buruk untuk secara implisit menerapkan zona waktu default JVM Anda saat ini ke nilai tanggal-waktu saat membuat representasi string melalui toStringmetodenya. Di sini Anda melihat America/Los_Angeleszona waktu saya diterapkan. Sebaliknya, kelas java.time lebih waras, menggunakan format ISO 8601 standar.
LocalDate d = LocalDate.of ( 2007 , 9 , 23 ) ;
ZoneId z = ZoneId.of ( "America/Montreal" ) ;
ZonedDateTime zdt = d.atStartOfDay( z ) ;
Instant instant = zdt.toInstant() ;
java.sql.Timestamp ts = java.sql.Timestamp.from ( instant ) ;
Buang ke konsol.
System.out.println ( "d: " + d + " = zdt: " + zdt + " = instant: " + instant + " = ts: " + ts );
Saat dijalankan.
d: 2007-09-23 = zdt: 2007-09-23T00: 00-04: 00 [Amerika / Montreal] = instan: 2007-09-23T04: 00: 00Z = ts: 2007-09-22 21:00: 00.0
Omong-omong, pada JDBC 4.2, Anda dapat menggunakan tipe java.time secara langsung. Tidak perlu java.sql.Timestamp.
PreparedStatement.setObjectResultSet.getObjectThe java.time kerangka dibangun ke Jawa 8 dan kemudian. Kelas-kelas ini menggantikan tua merepotkan warisan kelas tanggal-waktu seperti java.util.Date, Calendar, & SimpleDateFormat.
Proyek Joda-Time , sekarang dalam mode pemeliharaan , menyarankan migrasi ke kelas java.time .
Untuk mempelajari lebih lanjut, lihat Tutorial Oracle . Dan cari Stack Overflow untuk banyak contoh dan penjelasan. Spesifikasinya adalah JSR 310 .
Anda dapat bertukar objek java.time langsung dengan database Anda. Gunakan driver JDBC yang sesuai dengan JDBC 4.2 atau yang lebih baru. Tidak perlu string, tidak perlu java.sql.*kelas.
Dimana mendapatkan kelas java.time?
Proyek ThreeTen-Extra memperluas java.time dengan kelas tambahan. Proyek ini adalah tempat pembuktian untuk kemungkinan penambahan java.time di masa mendatang. Anda mungkin menemukan beberapa kelas berguna di sini seperti Interval, YearWeek, YearQuarter, dan lebih .
Anda juga bisa melakukan hal berikut:
// untested
Calendar cal = GregorianCalendar.getInstance();
cal.set(Calendar.DAY_OF_MONTH, 23);// I might have the wrong Calendar constant...
cal.set(Calendar.MONTH, 8);// -1 as month is zero-based
cal.set(Calendar.YEAR, 2009);
Timestamp tstamp = new Timestamp(cal.getTimeInMillis());
Menurut API , konstruktor yang akan menerima tahun, bulan, dan seterusnya sudah tidak digunakan lagi. Sebaliknya Anda harus menggunakan Pembuat yang menerima panjang. Anda dapat menggunakan implementasi Kalender untuk menyusun tanggal yang Anda inginkan dan mengakses representasi waktu sebagai long, misalnya dengan metode getTimeInMillis .
Demi kelengkapan, juga solusi dengan Joda-Time versi 2.5 dan DateTimekelasnya:
new Timestamp(new DateTime(2007, 9, 23, 0, 0, DateTimeZone.forID( "America/Montreal" )).getMillis())
DateTimeobjek. Itu berarti hasil Anda akan bervariasi di berbagai komputer atau konfigurasi OS host atau pengaturan JVM. Untuk hasil yang dapat diprediksi, teruskan zona waktu ke DateTimekonstruktor tersebut. Pilih nama zona waktu yang tepat untuk tujuan Anda. Misalnya, DateTimeZone.forID( "America/Montreal" )atau DateTimeZone.UTC.
DateTimeobjek milidetik-sejak-epochnya. Ganti .toDate().getTime()dengan .getMillis().
DateTimeZone.getDefault()dan meneruskan hasilnya sebagai argumen opsional. (Ngomong-ngomong, ditto untuk Locale.getDefault(), masalah yang sama tentang ambiguitas argumen opsional.)
Jawaban yang lebih umum adalah mengimpor java.util.Date, lalu ketika Anda perlu menyetel timestampsama dengan tanggal saat ini, cukup setel sama dengan new Date().