Tidak, java.util.Dateini tidak usang, tidak dari Jawa 8. Beberapa metode yang yang usang tetapi tidak seluruh kelas. Tetapi Anda harus menghindari keduanya java.util.Datedan java.util.Calendarkarena keduanya terkenal menyusahkan, membingungkan, dan cacat. Alih-alih menggunakan java.time (dalam Java 8) atau Joda-Time .
Basil Bourque
Jawaban:
636
int year =Calendar.getInstance().get(Calendar.YEAR);
Tidak yakin apakah ini memenuhi kriteria tidak menyiapkan Kalender baru? (Mengapa oposisi melakukannya?)
Setelah melihat jawaban Anda, Kalender akan menjadi objek yang baik untuk digunakan. Saya mencari satu-liner dan saya tidak berpikir bahwa Kalender akan memilikinya untuk saya. Terbukti salah aku! Terima kasih!
karlgrz
Bagaimana dengan konkurensi, bagaimana jika utas lain / kode perpustakaan berubah waktu saat ini? Bukankah masuk akal untuk mengubahnya menjadi sesuatu seperti: Kalender c = Calendar.getInstance (); disinkronkan (c) {c.setTimeInMillis (System.currentTimeMillis ()); return c.get (Calendar.YEAR);}
jnr
1
Ini mengembalikan nilai yang berbeda di berbagai versi Android. Saya membandingkan Android v4.1.2 dengan v4.2.1.
toobsco42
2
@ycnix Tidak ada masalah konkurensi dengan kode, jadi tidak perlu membuatnya lebih kompilasi. Calendar.getInstance().get(Calendar.YEAR) adalah atom dalam hal jam diubah secara eksternal, dan melakukan synchronized(c)pada contoh baru dari variabel lokal akan menjadi sangat tidak berguna di sini.
no
5
import java.util.Calendar
Dominykas Mostauskis
139
Menggunakan Java 8 ini waktu API (dengan asumsi Anda senang untuk mendapatkan tahun di zona waktu default sistem anda), Anda bisa menggunakan yang Year::nowmetode :
Saya sarankan selalu melewati ZoneIdargumen opsional nowdaripada mengandalkan secara implisit pada zona default JVM saat ini (yang dapat berubah setiap saat selama runtime!).
Ini mengembalikan nilai yang berbeda di berbagai versi Android. Saya membandingkan Android v4.1.2 dengan v4.2.1.
toobsco42
1
@ toobsco42 - coba googling untuk 'android calendar.year bug'
toolkit
Hai @toolkit, saya telah melakukan riset tanpa hasil. Saya berharap untuk jawaban yang lebih spesifik.
toobsco42
Saya mengeluarkan kartu SIM saya dari ponsel dengan 4.1.2. Jadi jaringan tidak dapat memperbarui Tanggal dan Waktu di telepon. Alhasil ponsel ini macet pada 2012. Sepertinya ini bukan bug di 4.1.2.
toobsco42
14
Cara termudah adalah mendapatkan tahun dari Kalender.
// year is stored as a static memberint year =Calendar.getInstance().get(Calendar.YEAR);
Calendar.YEAR didefinisikan demikian ... public int static final YEAR = 1;
cagcowboy
2
API get () pada Kalender mendapatkan datum yang ada di bidang yang ditentukan oleh konstanta. Tahun ini terletak di bidang 1 di objek Kalender! Calendar.getInstance () mendapatkan tanggal saat ini. java.sun.com/j2se/1.4.2/docs/api/java/util/…
Bob King
Ini mengembalikan nilai yang berbeda di berbagai versi Android. Saya membandingkan Android v4.1.2 dengan v4.2.1.
toobsco42
Saya mengeluarkan kartu SIM saya dari ponsel dengan 4.1.2. Jadi jaringan tidak dapat memperbarui Tanggal dan Waktu di telepon. Alhasil ponsel ini macet pada 2012. Sepertinya ini bukan bug di 4.1.2.
toobsco42
12
Anda juga dapat menggunakan 2 metode dari java.time.YearMonth(Karena Java 8):
import java.time.YearMonth;...int year =YearMonth.now().getYear();int month =YearMonth.now().getMonthValue();
Anda salah menyalin Jawaban lain yang sudah lama diposting. Dan Anda menghasilkan satu bulan yang tidak relevan dengan Pertanyaan. Dan Anda mengabaikan masalah penting zona waktu. Dan format Anda berantakan. Saya senang melihat Anda berpartisipasi dalam Stack Overflow. Tetapi jawaban ini tidak cukup baik. Edit untuk memperbaiki kelemahannya dan menambah nilai lebih dari yang sudah disediakan oleh Jawaban lain. Atau hapus Jawaban Anda sebelum mengumpulkan suara. Ikon PS Super avatar!
Basil Bourque
Terima kasih banyak. Saya sudah mengedit. tautannya sedikit berbeda dengan saya
Zhurov Konstantin
10
Jika Anda ingin tahun objek tanggal apa pun, saya menggunakan metode berikut:
publicstaticint getYearFromDate(Date date){int result =-1;if(date !=null){Calendar cal =Calendar.getInstance();
cal.setTime(date);
result = cal.get(Calendar.YEAR);}return result;}
Jawaban oleh Raffi Khatchadourian dengan bijak menunjukkan bagaimana menggunakan paket java.time baru di Java 8. Tetapi jawaban itu gagal untuk mengatasi masalah kritis zona waktu dalam menentukan tanggal.
int year = LocalDate.now (). getYear ();
Kode itu tergantung pada zona waktu default JVM saat ini. Zona default digunakan untuk menentukan tanggal hari ini. Ingat, misalnya, bahwa pada saat setelah tengah malam di Paris tanggal di Montréal masih 'kemarin'.
Jadi hasil Anda dapat bervariasi sesuai dengan mesin apa itu berjalan, pengguna / admin mengubah zona waktu OS host, atau kode Java setiap saat mengubah default JVM saat ini. Lebih baik menentukan zona waktu.
int year =ZonedDateTime.now(ZoneId.of("Africa/Casablanca")).getYear();
Joda-Time
Beberapa ide seperti di atas, tetapi menggunakan perpustakaan Joda-Time 2.7.
int year =DateTime.now(DateTimeZone.forID("Africa/Casablanca")).getYear();
Tahun Bertambah / Menurun
Jika tujuan Anda adalah melompat satu tahun sekaligus, tidak perlu mengekstraksi nomor tahun. Baik Joda-Time dan java.time memiliki metode untuk menambah / mengurangi tahun pada suatu waktu. Dan metode itu cerdas, menangani Daylight Saving Time dan anomali lainnya.
@ FBB Saya sarankan halaman Wikipedia untuk daftar IANA resmi untuk nama zona waktu. Hati-hati: Zona ini sering berubah secara mengejutkan. Jika Anda benar-benar ingin up-to-date info, download salinan dari satu tzdatadata file sendiri. Anda dapat membaca dengan teliti file. Dan Anda dapat mengganti tzdata yang sudah usang dalam implementasi Java Anda. Oracle menyediakan alat pembaruan untuk JVM mereka.
Basil Bourque
4
Jika aplikasi Anda banyak menggunakan objek Date dan Calendar, Anda harus menggunakan Joda Time, karena java.util.Datebisa berubah-ubah. java.util.Calendarmemiliki masalah kinerja ketika bidangnya diperbarui, dan kikuk untuk hitung waktu.
@ AndrewT., Dapatkan ThreeTen Backport dan itu akan bekerja di Java 6 dan 7 juga.
Ole VV
3
Seperti beberapa orang menjawab di atas:
Jika Anda ingin menggunakan variabel nanti, gunakan lebih baik:
int year;
year =Calendar.getInstance().get(Calendar.YEAR);
Jika Anda memerlukan tahun hanya untuk suatu kondisi yang lebih baik Anda gunakan:
Calendar.getInstance().get(Calendar.YEAR)
Misalnya menggunakannya dalam melakukan sedangkan pemeriksaan yang diperkenalkan tahun tidak kurang dari tahun berjalan-200 atau lebih dari tahun berjalan (Bisa jadi tahun kelahiran):
import java.util.Calendar;import java.util.Scanner;publicstaticvoid main (String[] args){Scanner scannernumber =newScanner(System.in);int year;/*Checks that the year is not higher than the current year, and not less than the current year - 200 years.*/do{System.out.print("Year (Between "+((Calendar.getInstance().get(Calendar.YEAR))-200)+" and "+Calendar.getInstance().get(Calendar.YEAR)+") : ");
year = scannernumber.nextInt();}while(year <((Calendar.getInstance().get(Calendar.YEAR))-200)|| year >Calendar.getInstance().get(Calendar.YEAR));}
Metode itu sudah usang. Dan kelas yang mengerikan itu digantikan bertahun-tahun yang lalu oleh kelas java.time yang didefinisikan dalam JSR 310. Lihat solusi modern dalam Jawaban oleh assylias .
Basil Bourque
ya tetapi saya secara aktif mencari solusi dan mencoba banyak solusi yang tersedia dan bagi saya yang satu ini berhasil jadi saya diposting :)
Mayur Satav
-1
Dalam Java versi 8+ dapat (disarankan untuk) menggunakan perpustakaan java.time . ISO 8601 menetapkan cara standar untuk menulis tanggal: YYYY-MM-DDdan java.time.Instantmenggunakannya, jadi (untuk UTC):
java.util.Date
ini tidak usang, tidak dari Jawa 8. Beberapa metode yang yang usang tetapi tidak seluruh kelas. Tetapi Anda harus menghindari keduanyajava.util.Date
danjava.util.Calendar
karena keduanya terkenal menyusahkan, membingungkan, dan cacat. Alih-alih menggunakan java.time (dalam Java 8) atau Joda-Time .Jawaban:
Tidak yakin apakah ini memenuhi kriteria tidak menyiapkan Kalender baru? (Mengapa oposisi melakukannya?)
sumber
Calendar.getInstance().get(Calendar.YEAR)
adalah atom dalam hal jam diubah secara eksternal, dan melakukansynchronized(c)
pada contoh baru dari variabel lokal akan menjadi sangat tidak berguna di sini.import java.util.Calendar
Menggunakan Java 8 ini waktu API (dengan asumsi Anda senang untuk mendapatkan tahun di zona waktu default sistem anda), Anda bisa menggunakan yang
Year::now
metode :sumber
ZoneId
argumen opsionalnow
daripada mengandalkan secara implisit pada zona default JVM saat ini (yang dapat berubah setiap saat selama runtime!).int year = Year.now(ZoneId.of("America/New_York")).getValue();
docs.oracle.com/javase/8/docs/api/java/time/Year.html#now--Ini yang paling sederhana (menggunakan Kalender, maaf) adalah:
Ada juga JSR Tanggal dan Waktu yang baru , serta Joda Time
sumber
Cara termudah adalah mendapatkan tahun dari Kalender.
sumber
Anda juga dapat menggunakan 2 metode dari
java.time.YearMonth
(Karena Java 8):sumber
Jika Anda ingin tahun objek tanggal apa pun, saya menggunakan metode berikut:
sumber
tl; dr
Zona waktu
Jawaban oleh Raffi Khatchadourian dengan bijak menunjukkan bagaimana menggunakan paket java.time baru di Java 8. Tetapi jawaban itu gagal untuk mengatasi masalah kritis zona waktu dalam menentukan tanggal.
Kode itu tergantung pada zona waktu default JVM saat ini. Zona default digunakan untuk menentukan tanggal hari ini. Ingat, misalnya, bahwa pada saat setelah tengah malam di Paris tanggal di Montréal masih 'kemarin'.
Jadi hasil Anda dapat bervariasi sesuai dengan mesin apa itu berjalan, pengguna / admin mengubah zona waktu OS host, atau kode Java setiap saat mengubah default JVM saat ini. Lebih baik menentukan zona waktu.
Omong-omong, selalu gunakan nama zona waktu yang tepat seperti yang didefinisikan oleh IANA . Jangan pernah menggunakan kode 3-4 huruf yang tidak terstandarisasi maupun unik.
waktu java
Contoh dalam java.time dari Java 8.
Joda-Time
Beberapa ide seperti di atas, tetapi menggunakan perpustakaan Joda-Time 2.7.
Tahun Bertambah / Menurun
Jika tujuan Anda adalah melompat satu tahun sekaligus, tidak perlu mengekstraksi nomor tahun. Baik Joda-Time dan java.time memiliki metode untuk menambah / mengurangi tahun pada suatu waktu. Dan metode itu cerdas, menangani Daylight Saving Time dan anomali lainnya.
Contoh dalam java.time .
Contoh dalam Joda-Time 2.7.
sumber
tzdata
data file sendiri. Anda dapat membaca dengan teliti file. Dan Anda dapat mengganti tzdata yang sudah usang dalam implementasi Java Anda. Oracle menyediakan alat pembaruan untuk JVM mereka.Jika aplikasi Anda banyak menggunakan objek Date dan Calendar, Anda harus menggunakan Joda Time, karena
java.util.Date
bisa berubah-ubah.java.util.Calendar
memiliki masalah kinerja ketika bidangnya diperbarui, dan kikuk untuk hitung waktu.sumber
Anda juga dapat menggunakan Java 8's
LocalDate
:sumber
Seperti beberapa orang menjawab di atas:
Jika Anda ingin menggunakan variabel nanti, gunakan lebih baik:
Jika Anda memerlukan tahun hanya untuk suatu kondisi yang lebih baik Anda gunakan:
Misalnya menggunakannya dalam melakukan sedangkan pemeriksaan yang diperkenalkan tahun tidak kurang dari tahun berjalan-200 atau lebih dari tahun berjalan (Bisa jadi tahun kelahiran):
sumber
Gunakan kode berikut untuk java 8:
sumber
Dalam kasus saya tidak satu pun di atas yang berfungsi. Jadi Setelah mencoba banyak solusi saya temukan di bawah satu dan ini berhasil untuk saya
sumber
Dalam Java versi 8+ dapat (disarankan untuk) menggunakan perpustakaan java.time . ISO 8601 menetapkan cara standar untuk menulis tanggal:
YYYY-MM-DD
danjava.time.Instant
menggunakannya, jadi (untukUTC
):PS berjaga-jaga (dan disingkat mendapatkan
String
, tidakint
), menggunakanCalendar
terlihat lebih baik dan dapat membuat zona sadar.sumber
Anda dapat melakukan semuanya menggunakan matematika Integer tanpa harus membuat instance kalender:
Mungkin libur satu atau dua jam di tahun baru, tapi saya tidak mendapat kesan itu masalah?
sumber
Saya menggunakan fungsi khusus di perpustakaan saya untuk bekerja dengan ints hari / bulan / tahun -
sumber