Jawaban:
int year = Calendar.getInstance().get(Calendar.YEAR);
Tidak yakin apakah ini memenuhi kriteria tidak menyiapkan Kalender baru? (Mengapa oposisi melakukannya?)
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.
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 :
int year = Year.now().getValue();
ZoneId
argumen opsional now
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:
int year = Calendar.getInstance().get(Calendar.YEAR);
Ada juga JSR Tanggal dan Waktu yang baru , serta Joda Time
Cara termudah adalah mendapatkan tahun dari Kalender.
// year is stored as a static member
int year = Calendar.getInstance().get(Calendar.YEAR);
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();
Jika Anda ingin tahun objek tanggal apa pun, saya menggunakan metode berikut:
public static int getYearFromDate(Date date) {
int result = -1;
if (date != null) {
Calendar cal = Calendar.getInstance();
cal.setTime(date);
result = cal.get(Calendar.YEAR);
}
return result;
}
ZonedDateTime.now( ZoneId.of( "Africa/Casablanca" ) )
.getYear()
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.
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.
Contoh dalam java.time dari Java 8.
int year = ZonedDateTime.now( ZoneId.of( "Africa/Casablanca" ) ).getYear() ;
Beberapa ide seperti di atas, tetapi menggunakan perpustakaan Joda-Time 2.7.
int year = DateTime.now( DateTimeZone.forID( "Africa/Casablanca" ) ).getYear() ;
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 .
ZonedDateTime zdt =
ZonedDateTime
.now( ZoneId.of( "Africa/Casablanca" ) )
.minusYears( 1 )
;
Contoh dalam Joda-Time 2.7.
DateTime oneYearAgo = DateTime.now( DateTimeZone.forID( "Africa/Casablanca" ) ).minusYears( 1 ) ;
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.
Anda juga dapat menggunakan Java 8's LocalDate
:
import java.time.LocalDate;
//...
int year = LocalDate.now().getYear();
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;
public static void main (String[] args){
Scanner scannernumber = new Scanner(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));
}
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
import java.util.Scanner;
import java.util.Date;
public class Practice
{
public static void main(String[] args)
{
Date d=new Date();
int year=d.getYear();
int currentYear=year+1900;
System.out.println(currentYear);
}
}
Dalam Java versi 8+ dapat (disarankan untuk) menggunakan perpustakaan java.time . ISO 8601 menetapkan cara standar untuk menulis tanggal: YYYY-MM-DD
dan java.time.Instant
menggunakannya, jadi (untuk UTC
):
import java.time.Instant;
int myYear = Integer.parseInt(Instant.now().toString().substring(0,4));
PS berjaga-jaga (dan disingkat mendapatkan String
, tidak int
), menggunakan Calendar
terlihat lebih baik dan dapat membuat zona sadar.
Anda dapat melakukan semuanya menggunakan matematika Integer tanpa harus membuat instance kalender:
return (System.currentTimeMillis()/1000/3600/24/365.25 +1970);
Mungkin libur satu atau dua jam di tahun baru, tapi saya tidak mendapat kesan itu masalah?
Saya menggunakan fungsi khusus di perpustakaan saya untuk bekerja dengan ints hari / bulan / tahun -
int[] int_dmy( long timestamp ) // remember month is [0..11] !!!
{
Calendar cal = new GregorianCalendar(); cal.setTimeInMillis( timestamp );
return new int[] {
cal.get( Calendar.DATE ), cal.get( Calendar.MONTH ), cal.get( Calendar.YEAR )
};
};
int[] int_dmy( Date d ) {
...
}
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 .