Jawaban:
Oleh Timestamp
, saya kira Anda maksud java.sql.Timestamp
. Anda akan melihat bahwa kelas ini memiliki konstruktor yang menerima long
argumen. Anda dapat mengurai ini menggunakan DateFormat
kelas:
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.SimpleDateFormat
sekarang 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 Instant
momen di timeline dalam UTC. A ZonedDateTime
adalah Sekejap yang disesuaikan dengan zona waktu ( ZoneId
).
Zona waktu sangat penting di sini. Tanggal September 23, 2007
tidak 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 toString
metodenya. Di sini Anda melihat America/Los_Angeles
zona 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.setObject
ResultSet.getObject
The 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 DateTime
kelasnya:
new Timestamp(new DateTime(2007, 9, 23, 0, 0, DateTimeZone.forID( "America/Montreal" )).getMillis())
DateTime
objek. 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 DateTime
konstruktor tersebut. Pilih nama zona waktu yang tepat untuk tujuan Anda. Misalnya, DateTimeZone.forID( "America/Montreal" )
atau DateTimeZone.UTC
.
DateTime
objek 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 timestamp
sama dengan tanggal saat ini, cukup setel sama dengan new Date()
.