Cara mendapatkan tanggal dan waktu saat ini

342

Bagaimana cara mendapatkan tanggal dan waktu saat ini di Jawa?

Saya mencari sesuatu yang setara dengan DateTime.Nowdari C #.

mrblah
sumber
Pertanyaan ini lebih tua dari Pertanyaan ini yang sebelumnya ditandai sebagai duplikat. Jadi saya membalikkan penunjukan, membuka kembali Pertanyaan ini dan menandai yang lebih baru sebagai duplikat.
Basil Bourque

Jawaban:

414

Hanya membangun Dateobjek baru tanpa argumen; ini akan menetapkan tanggal dan waktu saat ini ke objek baru.

import java.util.Date;

Date d = new Date();

Dalam kata-kata Javadocs untuk konstruktor argumen-nol :

Mengalokasikan objek Tanggal dan menginisialisasi sehingga mewakili waktu di mana dialokasikan , diukur ke milidetik terdekat.

Pastikan Anda menggunakan java.util.Datedan tidak java.sql.Date- yang terakhir tidak memiliki konstruktor zero-arg, dan memiliki semantik yang sedikit berbeda yang merupakan topik percakapan yang sama sekali berbeda. :)

delfuego
sumber
13
Perhatikan juga bahwa GregorianCalendar dan banyak objek serupa bekerja dengan cara yang sama. Jadi apa pun jenis objek tanggal / kalender yang Anda kerjakan, konstruktor argumen nol biasanya menginisialisasi objek ke tanggal / waktu saat ini.
Peter Di Cecco
Dari Date doc: Pada JDK 1.1, kelas Kalender harus digunakan untuk mengkonversi antara bidang tanggal dan waktu dan kelas DateFormat harus digunakan untuk memformat dan mengurai string tanggal.
Paolo M
9
Silakan pertimbangkan API Java8 baru - LocalDateTime.now () dan ZonedDateTime.now ()
Oleg Mikheev
59

Kelas Tanggal dan Kalender Java dianggap oleh banyak orang sebagai dirancang dengan buruk. Anda harus melihat Joda Time , perpustakaan yang biasa digunakan sebagai pengganti perpustakaan tanggal bawaan Java.

Setara dengan DateTime.Nowdi Joda Time adalah:

DateTime dt = new DateTime();

Memperbarui

Seperti disebutkan dalam komentar, versi terbaru Joda Time memiliki DateTime.now()metode, jadi:

DateTime dt = DateTime.now();
cdmckay
sumber
4
Versi Joda saat ini (2.1) tampaknya memiliki metode DateTime.now statis () (opsional menerima DateTimeZone atau Kronologi). joda-time.sourceforge.net/apidocs/org/joda/time/…
Roman A. Taycher
1
Perhatikan bahwa jawaban ini diposting pada tahun 2010. Java 8 telah menyerap banyak fitur terbaik Joda Time. Lihat dokumentasi resmi dan banyak artikel daring lainnya untuk informasi lebih lanjut.
DavidS
36

tl; dr

Instant.now()

waktu java

Kelas java.util.Date telah ketinggalan zaman dengan paket java.time baru ( Tutorial ) di Java 8 dan yang lebih baru. Kelas-kelas java.util.Date/.Calendar tua terkenal merepotkan, membingungkan, dan cacat. Hindari mereka.

ZonedDateTime

Dapatkan momen saat ini di java.time.

ZonedDateTime now = ZonedDateTime.now();

A ZonedDateTimemerangkum:

  • Tanggal.
  • Time-of-day, dengan sepersekian detik ke resolusi nanosecond .
  • Zona waktu.

Jika tidak ada zona waktu yang ditentukan, zona waktu default JVM Anda saat ini ditetapkan secara diam-diam. Lebih baik untuk menentukan zona waktu yang Anda inginkan / harapkan daripada bergantung secara implisit pada default.

ZoneId z = ZoneId.of( "Pacific/Auckland" );
ZonedDateTime zdt = ZonedDateTime.now( z );

UTC

Secara umum lebih baik untuk membiasakan melakukan pekerjaan back-end Anda (logika bisnis, database, penyimpanan, pertukaran data) semua dalam zona waktu UTC . Kode di atas bergantung secara implisit pada zona waktu default JVM saat ini.

The Instantkelas merupakan saat di timeline di UTC dengan resolusi nanodetik.

Instant instant = Instant.now();

The Instantkelas kelas bangunan-blok dasar di java.time dan dapat sering digunakan dalam kode Anda.

Saat Anda membutuhkan lebih banyak fleksibilitas dalam memformat, ubah menjadi OffsetDateTime. Tentukan ZoneOffsetobjek. Untuk UTC gunakan konstanta praktis untuk UTC .

OffsetDateTime odt = instant.atOffset( ZoneOffset.UTC );

Zona waktu

Anda mudah menyesuaikan dengan zona waktu lain untuk presentasi kepada pengguna. Gunakan nama zona waktu yang tepat , jangan pernah kode 3-4 huruf seperti ESTatau IST.

ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime nowMontreal = instant.atZone( z );

Hasilkan representasi String dari nilai tanggal-waktu itu, dilokalkan.

String output = DateTimeFormatter
    .ofLocalizedDate( FormatStyle.FULL )
    .withLocale( Locale.CANADA_FRENCH )
    .format ( nowMontreal );

Instant

Atau, untuk tetap di UTC, gunakan Instant. Sebuah Instantobjek mewakili momen di timeline, hingga resolusi nanosecond, selalu dalam UTC. Ini menyediakan blok bangunan untuk waktu-waktu yang dikategorikan, bersama dengan penugasan zona waktu. Anda dapat memikirkannya secara konseptual dengan cara ini:

ZonedDateTime= Instant+ZoneId

Anda dapat mengekstrak Instantdari ZonedDateTime.

Instant instantNow = zdt.toInstant();

Anda bisa mulai dengan Instan. Tidak perlu menentukan zona waktu di sini, seperti Instantbiasa di UTC.

Instant now = Instant.now();
Basil Bourque
sumber
Saya juga memposting jawaban lain dengan rincian lebih lanjut tentang Pertanyaan rangkap.
Basil Bourque
16

Saya lebih suka menggunakan objek Kalender.

Calendar now = GregorianCalendar.getInstance()

Saya merasa jauh lebih mudah untuk dikerjakan. Anda juga bisa mendapatkan objek Tanggal dari Kalender.

http://java.sun.com/javase/6/docs/api/java/util/GregorianCalendar.html

muntah
sumber
4
Atau bisa juga dengan sederhanaCalendar.getInstance()
gambar
14

Di Java 8 itu:

ZonedDateTime dateTime = ZonedDateTime.now();
Vitalii Fedorenko
sumber
12
import java.util.Date;   
Date now = new Date();

Perhatikan bahwa objek Date bisa berubah dan jika Anda ingin melakukan sesuatu yang canggih, gunakan jodatime .

Chandra Patni
sumber
10

java.lang.System.currentTimeMillis(); akan mengembalikan datetime sejak zaman

pengguna243773
sumber
Baik untuk masuk tetapi membutuhkan penguraian dan konversi untuk ditampilkan kepada pengguna
Rishi Dua
6
import org.joda.time.DateTime;

DateTime now = DateTime.now();
bagus
sumber
5

Jika Anda membuat objek Date baru, secara default akan diatur ke waktu saat ini:

import java.util.Date;
Date now = new Date();
parkerfath
sumber
3

Java selalu mendapat dukungan yang tidak memadai untuk kasus penggunaan tanggal dan waktu. Misalnya, kelas-kelas yang ada (seperti java.util.Datedan SimpleDateFormatter) tidak aman-thread yang dapat menyebabkan masalah konkurensi. Juga ada beberapa kekurangan di API. Misalnya, tahun java.util.Datemulai dari tahun 1900, bulan mulai dari 1, dan hari mulai dari 0 — tidak terlalu intuitif. Masalah-masalah ini menyebabkan popularitas perpustakaan tanggal dan waktu pihak ketiga, seperti Joda-Time. Untuk mengatasi tanggal dan waktu yang baru, API dirancang untuk Java SE 8.

LocalDateTime timePoint = LocalDateTime.now();
System.out.println(timePoint);

Sesuai dok :

Metode now()mengembalikan tanggal saat ini menggunakan jam sistem dan zona waktu default, bukan nol . Itu memperoleh tanggal-waktu saat ini dari jam sistem di zona waktu default. Ini akan meminta jam sistem di zona waktu default untuk mendapatkan tanggal-waktu saat ini. Menggunakan metode ini akan mencegah kemampuan untuk menggunakan jam alternatif untuk pengujian karena jam tersebut dikodekan dengan keras.

akhil_mittal
sumber