Bagaimana cara mendapatkan cap waktu saat ini dalam format string di Jawa? "Yyyy.MM.dd.HH.mm.ss"

174

Bagaimana cara mendapatkan cap waktu dalam format string di Jawa? "yyyy.MM.dd.HH.mm.ss"

String timeStamp = new SimpleDateFormat("yyyy.MM.dd.HH.mm.ss").format(new Timestamp());

Ini yang saya miliki, tetapi Timestamp () membutuhkan parameter ...

pengguna3388884
sumber
readyStatement.setTimestamp (1, Timestamp baru (System.currentTimeMillis ()));
Rajat
Kesalahan apa yang Anda dapatkan?
Robert Columbia
FYI, kelas tanggal-waktu lama yang sangat menyusahkan seperti SimpleDateFormatdan java.sql.Timestampsekarang adalah warisan , digantikan oleh kelas java.time yang dibangun ke dalam Java 8 dan yang lebih baru. Lihat Tutorial oleh Oracle .
Basil Bourque

Jawaban:

202

Menggantikan

new Timestamp();

dengan

new java.util.Date()

karena tidak ada konstruktor default untuk Timestamp, atau Anda dapat melakukannya dengan metode:

new Timestamp(System.currentTimeMillis());
Jigar Joshi
sumber
5
FYI, kelas tanggal-waktu lama yang sangat menyusahkan seperti java.util.Datedan java.sql.Timestampsekarang adalah warisan , digantikan oleh kelas java.time yang dibangun ke dalam Java 8 dan yang lebih baru. Lihat Tutorial oleh Oracle .
Basil Bourque
160

Gunakan java.util.Datekelas bukan Timestamp.

String timeStamp = new SimpleDateFormat("yyyy.MM.dd.HH.mm.ss").format(new Date());

Ini akan memberi Anda tanggal saat ini dalam format yang ditentukan.

dimoniy
sumber
5
Ini membantu saya keluar dan saya membuat beberapa perubahan jadi saya tidak perlu mengimpor new java.text.SimpleDateFormat("dd/MM/yyyy HH:mm:ss").format(new java.util.Date())
Pini Cheyni
Lebih baik new SimpleDateFormat("yyyy.MM.dd HH:mm:ss").format(new Date());
Zon
36

tl; dr

Gunakan hanya kelas java.time modern . Tidak pernah menggunakan kelas warisan yang mengerikan seperti SimpleDateFormat, Date, atau java.sql.Timestamp.

ZonedDateTime                    // Represent a moment as perceived in the wall-clock time used by the people of a particular region ( a time zone).
.now(                            // Capture the current moment.
    ZoneId.of( "Africa/Tunis" )  // Specify the time zone using proper Continent/Region name. Never use 3-4 character pseudo-zones such as PDT, EST, IST. 
)                                // Returns a `ZonedDateTime` object. 
.format(                         // Generate a `String` object containing text representing the value of our date-time object. 
    DateTimeFormatter.ofPattern( "uuuu.MM.dd.HH.mm.ss" )
)                                // Returns a `String`. 

Atau gunakan zona waktu default JVM saat ini.

ZonedDateTime
.now( ZoneId.systemDefault() )
.format( DateTimeFormatter.ofPattern( "uuuu.MM.dd.HH.mm.ss" ) )

java.time & JDBC 4.2

Pendekatan modern menggunakan kelas java.time seperti yang terlihat di atas.

Jika driver JDBC Anda sesuai dengan JDBC 4.2 , Anda dapat langsung bertukar objek java.time dengan database. Gunakan PreparedStatement::setObjectdan ResultSet::getObject.

Gunakan java.sql hanya untuk driver sebelum JDBC 4.2

Jika driver JDBC Anda belum mematuhi JDBC 4.2 untuk dukungan tipe java.time , Anda harus kembali menggunakan kelas java.sql.

Menyimpan data.

OffsetDateTime odt = OffsetDateTime.now( ZoneOffset.UTC ) ;  // Capture the current moment in UTC.
myPreparedStatement.setObject(  , odt ) ;

Mengambil data.

OffsetDateTime odt = myResultSet.getObject(  , OffsetDateTime.class ) ;

Tipe java.sql, seperti java.sql.Timestamp, seharusnya hanya digunakan untuk transfer masuk dan keluar dari database. Segera konversi ke tipe java.time di Java 8 dan yang lebih baru.

java.time.Instant

A java.sql.Timestampmemetakan ke java.time.Instant, sesaat pada timeline di UTC. Perhatikan metode konversi baru yang toInstantditambahkan ke kelas lama.

java.sql.Timestamp ts = myResultSet.getTimestamp(  );
Instant instant = ts.toInstant(); 

Zona waktu

Terapkan zona waktu yang diinginkan / diharapkan ( ZoneId) untuk mendapatkan a ZonedDateTime.

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

String Terformat

Gunakan a DateTimeFormatteruntuk menghasilkan string Anda. Kode polanya mirip dengan yang ada java.text.SimpleDateFormattetapi tidak persis, jadi baca dokumen dengan cermat.

DateTimeFormatter formatter = DateTimeFormatter.ofPattern( "uuuu.MM.dd.HH.mm.ss" );
String output = zdt.format( formatter );

Format khusus ini tidak jelas untuk arti persisnya karena tidak memiliki indikasi offset-dari-UTC atau zona waktu.

ISO 8601

Jika Anda memiliki hak suara dalam masalah ini, saya sarankan Anda mempertimbangkan untuk menggunakan format standar ISO 8601 daripada menggulirkan sendiri. Format standar sangat mirip dengan Anda. Sebagai contoh:
2016-02-20T03:26:32+05:30.

Kelas java.time menggunakan format standar ini secara default, jadi tidak perlu menentukan pola. The ZonedDateTimekelas meluas format standar dengan menambahkan nama zona waktu (perbaikan bijaksana).

String output = zdt.toString(); // Example: 2007-12-03T10:15:30+01:00[Europe/Paris]

Konversikan ke java.sql

Anda dapat mengonversi dari java.time kembali ke java.sql.Timestamp. Ekstrak Instantdari ZonedDateTime.

Metode baru telah ditambahkan ke kelas lama untuk memfasilitasi konversi ke / dari kelas java.time.

java.sql.Timestamp ts = java.sql.Timestamp.from( zdt.toInstant() );

Tabel tipe tanggal-waktu di Jawa (baik yang lama maupun yang modern) dan dalam SQL standar


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. Spesifikasi adalah JSR 310 .

Anda dapat bertukar objek java.time secara langsung dengan database Anda. Gunakan driver JDBC yang sesuai dengan JDBC 4.2 atau yang lebih baru. Tidak perlu untuk string, tidak perlu untuk java.sql.*kelas.

Di mana mendapatkan kelas java.time?

Proyek ThreeTen-Extra memperpanjang java.time dengan kelas tambahan. Proyek ini adalah ajang pembuktian untuk kemungkinan penambahan masa depan ke java.time. Anda mungkin menemukan beberapa kelas berguna di sini seperti Interval, YearWeek, YearQuarter, dan lebih .

Basil Bourque
sumber
Jadi, apa Cara yang Benar untuk mendapatkan cap waktu jam dinding saat ini dalam format "yyyy.MM.dd.HH.mm.ss"? Tanpa secara eksplisit menentukan string kode keras dari zona waktu lokal saya? Itulah yang diminta starter topik, dan saya tidak dapat menemukannya dalam jawaban Anda ...
t7ko
@ t7ko Saya menambahkan sederet kode contoh ke bagian tl; dr yang menunjukkan cara bertanya secara eksplisit tentang zona waktu default JVM saat ini. Memanggil `now () 'tanpa argumen apa pun melakukan hal yang sama tetapi tidak jelas apakah Anda bermaksud menggunakan default atau jika Anda tidak tahu atau lupa tentang masalah penting zona waktu.
Basil Bourque
32

Anda dapat menggunakan java.util.Date alih-alih Timestamp:

String timeStamp = new SimpleDateFormat("yyyy.MM.dd.HH.mm.ss").format(new Date());
Kakarot
sumber
6

Pendekatan yang lebih tepat adalah menentukan wilayah Lokal sebagai parameter dalam konstruktor. Contoh di bawah ini menggunakan wilayah Lokal AS. Pemformatan tanggal peka-lokal dan menggunakan Lokal untuk menyesuaikan informasi relatif dengan kebiasaan dan konvensi kawasan pengguna (Java Platform SE 7)

String timeStamp = new SimpleDateFormat("yyyy.MM.dd.HH.mm.ss", Locale.US).format(new Date());
pengguna3144836
sumber
1
Tidak ada yang namanya "Zona Lokal". Saya menduga Anda membingungkan Localedan zona waktu yang tidak terkait. Localemengontrol norma budaya untuk pemformatan dan bahasa manusia yang digunakan untuk nama bulan / hari. Zona waktu menyesuaikan representasi tanggal-waktu agar sesuai dengan waktu-jam dinding suatu wilayah . Dalam kasus Pertanyaan ini, Lokal tidak relevan karena tidak ada masalah pemformatan untuk menerapkan norma budaya dan juga tidak ada nama bulan / hari untuk dilokalisasi ke bahasa manusia tertentu.
Basil Bourque
@BasilBourque Terima kasih atas masukan Anda. Saya telah memperbarui jawabannya menjadi lebih eksplisit
user3144836
4

Anda dapat menggunakan yang berikut ini

new java.sql.Timestamp(System.currentTimeMillis()).getTime()

Result : 1539594988651

Semoga ini bisa membantu. Hanya saran saya dan bukan untuk poin hadiah.

Phoenix
sumber
Tidak ada format string yang diminta. Juga saya khawatir bahwa satu-satunya hal yang ditambahkan ke beberapa jawaban yang sama, adalah komplikasi yang tidak perlu ...
Ole VV
4

Gunakan java.timekelas modern jika Anda menggunakan java 8 atau lebih baru.

String s = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").format(LocalDateTime.now());

Jawaban Basil Bourque cukup bagus. Tapi ini terlalu lama. Banyak orang tidak punya kesabaran untuk membacanya. 3 jawaban teratas terlalu tua dan mungkin menyesatkan lebah baru Jawa. Jadi saya berikan jawaban singkat dan modern ini untuk pengembang baru yang baru datang. Semoga jawaban ini bisa mengurangi penggunaan yang mengerikan SimpleDateFormat.

gzc
sumber