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


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

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

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

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 .


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

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 .


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

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


karena ** Tanggal ("string"); ** tidak digunakan lagi
Ashish Ratan
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.