Java Timestamp - Bagaimana cara membuat Timestamp dengan tanggal 23/09/2007?

100

Bagaimana cara membuat Stempel Waktu dengan tanggal 23/09/2007?

pigouina
sumber

Jawaban:

154

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);
Adam Paynter
sumber
1
Format tanggal ISO normal adalah tttt-BB-hh, jika tidak bagus!
vidstige
1
Stempel Waktu baru (waktu); memberikan kesalahan bahwa tidak ada konstruktor seperti ini yang mengambil nilai panjang :(
Bhanu Sharma
1
@Bhanu Dokumen menunjukkan bahwa ini memang membutuhkan waktu lama dan tampaknya berfungsi dengan benar: docs.oracle.com/javase/7/docs/api/java/sql/…
Hazok
FYI, kelas tanggal-waktu yang sangat merepotkan lama seperti 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 .
Basil Bourque
121

Bagaimana dengan ini?

java.sql.Timestamp timestamp = java.sql.Timestamp.valueOf("2007-09-23 10:10:10.0");
pigouina
sumber
1
Timestamp timestamp = Timestamp.valueOf ("2007-09-23 10: 10: 10.0"); menunjukkan metode valueOf tidak ditentukan untuk tipe Timestamp di jDK 7
Ashish Ratan
Stempel Waktu baru (waktu); memberikan kesalahan bahwa tidak ada konstruktor seperti ini yang mengambil nilai string :(
Bhanu Sharma
@Bhanu Konstruktor membutuhkan waktu unix dalam milidetik. Gunakan metode statis valueOf jika Anda ingin mendapatkan stempel waktu dari string.
Hazok
4
Tampaknya ini adalah jawaban terbaik untuk pertanyaan itu.
Hazok
1
Jawaban terbaiknya adalah Tanggal, yang sudah tidak berlaku lagi, adalah praktik buruk untuk menggunakannya. Jawaban ini lebih baik. Terima kasih
Alberici
18

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);
Matthew Flaschen
sumber
2
SALAH dan tidak dapat dikompilasi! Kesalahan kompilasi: 09 adalah angka oktal, tetapi 9 di luar rentang oktal. Kesalahan logika: bulan berbasis 0, Anda akan mendapatkan 23 OKTOBER 2007
pengguna85421
Saya tidak bisa mendapatkan kesalahan logika jika tidak dapat dikompilasi. :) Serius, tangkapan bagus, Carlos. Oktal yang saya tangkap sebelumnya tetapi salah tempel. :(
Matthew Flaschen
Sebenarnya konstruktor Timestamp dikesampingkan, Anda bisa menggunakan metode Timestamp.valueOf ()
Shiva Komuravelly
@ShivaKomuravelly tidak semua konstruktor stempel waktu tidak digunakan lagi dan setidaknya tidak membutuhkan waktu selama milidetik, konstruktor yang menggunakan tanggal sebagai argumen tidak digunakan lagi
tidak ada nama
Dan ada konstanta untuk itu (bukan bulan = 9):Calendar.SEPTEMBER
Guillaume Husta
11

tl; dr

java.sql.Timestamp.from (
    LocalDate.of ( 2007 , 9 , 23 )
             .atStartOfDay( ZoneId.of ( "America/Montreal" ) )
             .toInstant()
)

java.time

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.setObject
  • ResultSet.getObject

Tentang java.time

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 .

Basil Bourque
sumber
3
Saya ingin tahu bagaimana saya bisa mendapatkan OP atau mod untuk menandai jawaban Anda sebagai jawaban yang benar. Jawaban yang diterima sudah sangat kuno.
sttaq
Sangat bagus, kecuali salah ketik. asStartOfDay () harus atStartOfDay ().
Tullochgorum
@Tulgorum Tetap. Terima kasih. FYI, di Stack Overflow, Anda dapat melakukan pengeditan tersebut sendiri, jika Anda mau.
Basil Bourque
5

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());
Alex
sumber
2
SALAH: coba hasil System.out.println! Anda akan mendapatkan sesuatu seperti: "2009-10-23 15: 26: 56.171" Bulan berbasis 0 jadi 9 adalah Oktober!
pengguna85421
Saya tahu salah satu konstanta itu berbasis nol, terima kasih. Posting diperbarui.
Alex
1
Oh, dan saya menempatkan 'belum teruji' :)
Alex
4

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 .

Philipp
sumber
1

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())
pengguna152468
sumber
1
Jawaban bagus, tetapi Anda melewatkan satu bagian penting : zona waktu . Jika Anda menghilangkan zona waktu, zona waktu default JVM saat ini diterapkan ke 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.
Basil Bourque
Kode itu bisa lebih singkat. Tidak perlu mengonversi ke java.util.Date untuk mendapatkan dan meneruskan milidetik-sejak- epoch . Tanyakan saja DateTimeobjek milidetik-sejak-epochnya. Ganti .toDate().getTime()dengan .getMillis().
Basil Bourque
@BasilBourque Tergantung pada keadaan, Anda mungkin ingin meninggalkan zona waktu agar mendapatkan hasil yang dapat diprediksi. "Dalam zona waktu Anda saat ini" bisa menjadi hasil yang sangat masuk akal dan dapat diprediksi. Mengapa membuat hardcode zona waktu, atau meminta Anda pengguna untuk menyetel zona waktu secara manual saat komputer mereka sudah menyetel zona waktu? Tentu saya akan sangat terkejut jika aplikasi di komputer saya mulai mengeluarkan tanggal yang disesuaikan dengan zona waktu Amerika / Montreal.
dan carter
@dancarter Menghilangkan zona waktu opsional dapat menimbulkan kebingungan. Kelalaian meningkatkan ambiguitas (a) apakah programmer bermaksud untuk mengandalkan default implisit atau (b) apakah programmer gagal untuk mempertimbangkan masalah zona waktu (seperti yang terlalu umum). Jika Anda memang ingin menggunakan zona waktu default JVM saat ini, katakan secara eksplisit dengan memanggil DateTimeZone.getDefault()dan meneruskan hasilnya sebagai argumen opsional. (Ngomong-ngomong, ditto untuk Locale.getDefault(), masalah yang sama tentang ambiguitas argumen opsional.)
Basil Bourque
-1

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().

CSquid
sumber
karena ** Tanggal ("string"); ** tidak digunakan lagi
Ashish Ratan