Dapatkan nilai integer dari tahun berjalan di Jawa

300

Saya perlu menentukan tahun saat ini di Jawa sebagai bilangan bulat. Saya hanya bisa menggunakan java.util.Date(), tetapi sudah usang.

karlgrz
sumber
3
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?)

cagcowboy
sumber
1
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 :

int year = Year.now().getValue();
assylias
sumber
7
Saya sarankan selalu melewati ZoneIdargumen opsional nowdaripada mengandalkan secara implisit pada zona default JVM saat ini (yang dapat berubah setiap saat selama runtime!).
Basil Bourque
Yang terlihat suka BTW ini: int year = Year.now(ZoneId.of("America/New_York")).getValue(); docs.oracle.com/javase/8/docs/api/java/time/Year.html#now--
bcmoney
25

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

toolkit
sumber
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 member
int year = Calendar.getInstance().get(Calendar.YEAR);
conmulligan
sumber
Kalender. TAHUN bukan tahun ini.
toolkit
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();
Zhurov Konstantin
sumber
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:

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;
}
basZero
sumber
hasilnya adalah 1970!
Dr. aNdRO
10

tl; dr

ZonedDateTime.now(  ZoneId.of( "Africa/Casablanca" )  )
             .getYear()

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.

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.

waktu java

Contoh dalam java.time dari Java 8.

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.

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 ) ;
Basil Bourque
sumber
2
Semua ID zona untuk yang malas (seperti saya): mkyong.com/java8/java-display-all-zoneid-and-its-utc-offset
FBB
1
@ 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.

Alan
sumber
3

Anda juga dapat menggunakan Java 8's LocalDate:

import java.time.LocalDate;
//...
int year = LocalDate.now().getYear();
Raffi Khatchadourian
sumber
1
@ 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;

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));
}
maral04
sumber
3

Gunakan kode berikut untuk java 8:

LocalDate localDate = LocalDate.now();
int year = localDate.getYear();
int month = localDate.getMonthValue();
int date = localDate.getDayOfMonth();
KayV
sumber
0

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

    }

}
Mayur Satav
sumber
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):

import java.time.Instant;
int myYear = Integer.parseInt(Instant.now().toString().substring(0,4));

PS berjaga-jaga (dan disingkat mendapatkan String, tidak int), menggunakan Calendarterlihat lebih baik dan dapat membuat zona sadar.

Alexei Martianov
sumber
Anda mengabaikan masalah penting zona waktu. Lihat solusi yang lebih sederhana di Jawaban lainnya .
Basil Bourque
-2

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?

Ewan Makepeace
sumber
9
apakah Anda bekerja untuk apel, mungkin? macworld.com/article/2023580/…
Stefan Paul Noack
wow, ini sangat berat, saya sarankan untuk tetap sederhana seperti cagcowboy telah menunjukkannya.
LStrike
Ini mungkin bukan yang terbaik dalam semua keadaan, tetapi itu tidak pantas diturunkan.
JohnnyLambada
-4

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 ) { 
 ...
}
maks
sumber