Java'da geçerli yılın tamsayı değerini alın


300

Java'da geçerli yılı bir tamsayı olarak belirlemem gerekiyor. Sadece kullanabilirim java.util.Date(), ama kullanımdan kaldırıldı.


3
Hayır, java.util.Datebir değil , tüm sınıf kaldırıldığını değil Java 8. yöntemlerinden bazıları itibariyle kaldırılmış ancak. Ama hem kaçınmalısınız java.util.Dateve java.util.Calendaronlar herkesin bildiği kafa karıştırıcı, zahmetli ve kusurlu oldukları gibi. Bunun yerine java.time (Java 8'de) veya Joda-Time kullanın .
Basil Bourque

Yanıtlar:


636
int year = Calendar.getInstance().get(Calendar.YEAR);

Bunun yeni bir Takvim oluşturma kriterlerini karşılayıp karşılamadığından emin değil misiniz? (Neden böyle bir muhalefet?)


1
Cevabınızı gördükten sonra Takvim kullanmak için iyi bir nesne olacaktır. Tek astarlı bir yer arıyordum ve Takvim'in benim için buna sahip olacağını düşünmemiştim. Yanlış olduğumu kanıtladım! Teşekkürler!
karlgrz

Eşzamanlılık ne olacak, diğer kütüphane kodu / parçacığı şimdiki zamanı değiştirirse ne olur? Bunun gibi bir şeyle değiştirilmesi makul olmaz mıydı: Calendar c = Calendar.getInstance (); senkronize (c) {c.setTimeInMillis (System.currentTimeMillis ()); return c.get (Calendar.YEAR);}
jnr

1
Bu, Android'in farklı sürümlerinde farklı bir değer döndürür. Android v4.1.2'yi v4.2.1 ile karşılaştırıyorum.
toobsco42

2
@ycnix Kodla ilgili bir eşzamanlılık sorunu yoktur, bu yüzden kodun daha derlenmiş olmasına gerek yoktur. Calendar.getInstance().get(Calendar.YEAR) dışsal olarak değiştirilen saat açısından atomiktir ve synchronized(c)yerel bir değişkenin yeni bir örneğini yapmak burada bir şekilde anlamsız olacaktır.
nos

5
import java.util.Calendar
Dominykas Mostauskis

139

Java 8'in zaman API'sini kullanarak, kullanabilirsiniz (sisteminizin varsayılan saat diliminde yıl olsun mutlu varsayarak) yöntemini :Year::now

int year = Year.now().getValue();

7
Ben her zaman isteğe bağlı ZoneIdargüman nowJVM geçerli varsayılan bölge (çalışma sırasında herhangi bir anda değişebilir!) Dolaylı olarak güvenmek yerine geçirilmesini öneririz .
Basil Bourque

BTW bunu beğendi: int year = Year.now(ZoneId.of("America/New_York")).getValue(); docs.oracle.com/javase/8/docs/api/java/time/Year.html#now--
bcmoney

25

Bu en basit (Takvim kullanarak üzgünüm):

 int year = Calendar.getInstance().get(Calendar.YEAR);

Joda Time'ın yanı sıra yeni Date and Time API JSR de var


Bu, Android'in farklı sürümlerinde farklı bir değer döndürür. Android v4.1.2'yi v4.2.1 ile karşılaştırıyorum.
toobsco42

1
@ toobsco42 - 'android calendar.year bug' için googling yapmayı deneyin
araç seti

Hey @Araç Seti, şanssız araştırmalar yapıyorum. Daha spesifik bir cevap bekliyordum.
toobsco42

4.1.2 ile SIM kartımı telefondan çıkardım. Böylece şebeke telefonda Tarih ve Saati güncelleyemedi. Sonuç olarak telefon 2012'de sıkışmış. Görünüşe göre bu 4.1.2'de bir hata değil.
toobsco42

14

En kolay yol, yılı Takvim'den almaktır.

// year is stored as a static member
int year = Calendar.getInstance().get(Calendar.YEAR);

Calendar.YEAR bu yıl değil.
araç seti

Calendar.YEAR böylece tanımlanır ... genel nihai statik int YIL = 1;
cagcowboy

2
Takvim'deki get () API'si, sabit tarafından belirtilen alanda bulunan verileri alır. Yıl, Takvim nesnesindeki 1'in alanında bulunur! Calendar.getInstance () geçerli tarihi alıyor. java.sun.com/j2se/1.4.2/docs/api/java/util/…
Bob King

Bu, Android'in farklı sürümlerinde farklı bir değer döndürür. Android v4.1.2'yi v4.2.1 ile karşılaştırıyorum.
toobsco42

4.1.2 ile SIM kartımı telefondan çıkardım. Böylece şebeke telefonda Tarih ve Saati güncelleyemedi. Sonuç olarak telefon 2012'de sıkışmış. Görünüşe göre bu 4.1.2'de bir hata değil.
toobsco42

13

java.time.YearMonth(Java 8'den beri) ' den 2 yöntem de kullanabilirsiniz :

import java.time.YearMonth;
...
int year = YearMonth.now().getYear();
int month = YearMonth.now().getMonthValue();

Uzun zaman önce gönderilen başka bir Yanıtı yanlış kopyaladınız . Ve siz soruyla alakasız bir ay üretiyorsunuz. Ve zaman diliminin önemli meselesini görmezden geliyorsunuz. Ve biçimlendirmeniz dağınık. Stack Overflow'a katıldığını gördüğüme sevindim. Ama bu cevap yeterince iyi değil. Zayıf yönlerini düzeltmek için düzenleyin ve diğer Yanıtlar tarafından sağlanan değerlerin ötesine daha fazla değer katın. Veya cevabınızı aşağı oy toplamadan önce silin. PS Süper avatar simgesi!
Basil Bourque

Çok teşekkürler adamım. Düzenledim. bağlantı benim yolumdan biraz farklı
Zhurov Konstantin

10

Herhangi bir date nesnesinin yılını istiyorsanız, aşağıdaki yöntemi kullandım:

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

sonuç 1970!
Dr. aNdRO

10

tl; Dr.

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

Saat dilimi

Cevap tarafından Raffi Khatchadourian akıllıca yeni nasıl kullanılacağını gösterir java.time paketi cevap Java 8'de Ama bu bir tarih belirlenmesinde zaman dilimine kritik sorunu gidermek için başarısız olur.

int yıl = LocalDate.now (). getYear ();

Bu kod JVM'nin geçerli varsayılan saat dilimine bağlıdır. Varsayılan bölge, günün tarihinin belirlenmesinde kullanılır. Örneğin, Paris'te gece yarısından sonra, Montréal'deki tarihin hala 'dün' olduğunu hatırlayın.

Dolayısıyla, sonuçlarınız hangi makinede çalıştığına, ana işletim sisteminin saat dilimini değiştiren bir kullanıcıya / yöneticiye veya herhangi bir anda JVM'nin geçerli varsayılanını değiştiren herhangi bir Java koduna göre değişebilir. Zaman dilimini belirtmek daha iyidir.

Bu arada, her zaman kullanmak uygun bir zaman dilimi isimleri olarak IANA'da tarafından tanımlanan . Hiçbir zaman standart veya benzersiz olmayan 3-4 harf kodunu kullanmayın.

java.time

Java 8'in java.time örneğidir.

int year = ZonedDateTime.now(  ZoneId.of( "Africa/Casablanca" )  ).getYear() ;

Joda-Time

Yukarıdaki gibi bazı fikirler, ancak Joda-Time 2.7 kitaplığını kullanma.

int year = DateTime.now( DateTimeZone.forID( "Africa/Casablanca" ) ).getYear() ;

Artan / Azalan Yıl

Hedefiniz bir kerede bir yıl atlamaksa, yıl sayısını çıkarmanıza gerek yoktur. Hem Joda-Time hem de java.time, bir seferde bir yıl ekleme / çıkarma yöntemlerine sahiptir. Ve bu yöntemler akıllıdır, Yaz Saati Uygulaması ve diğer anomalileri ele alır.

Joda-Time 2.7'de Örnek.

DateTime oneYearAgo = DateTime.now( DateTimeZone.forID( "Africa/Casablanca" ) ).minusYears( 1 ) ;

2
Tembel olanlar için tüm bölge kimlikleri (benim gibi): mkyong.com/java8/java-display-all-zoneid-and-its-utc-offset
FBB

1
@FBB Resmi IANA saat dilimi adları listesi için Wikipedia sayfasını öneriyorum .Dikkat: Bu bölgeler şaşırtıcı bir şekilde sık sık değişir. Gerçekten güncel bilgiler istiyorsanız , tzdataveri dosyasının yeni bir kopyasını kendiniz indirin. Dosyayı inceleyebilirsiniz. Java uygulamanızda eski bir tzdata'yı değiştirebilirsiniz. Oracle, JVM'leri için bir güncelleme aracı sağlar .
Basil Bourque

4

Uygulamanız Tarih ve Takvim nesnelerini yoğun bir şekilde kullanıyorsa java.util.Date, değişebilir olduğu için gerçekten Joda Time'ı kullanmalısınız . java.util.Calendaralanları güncellendiğinde performans sorunları yaşar ve datetime aritmetiği için karmaşıktır.



3

Bazı insanların yukarıda yanıtladığı gibi:

Değişkeni daha sonra kullanmak istiyorsanız, daha iyi kullanın:

int year;

year = Calendar.getInstance().get(Calendar.YEAR);

Yıla sadece bir koşul için ihtiyacınız varsa daha iyi kullanın:

Calendar.getInstance().get(Calendar.YEAR)

Örneğin, yapılan denetimlerin yürürlüğe girdiği yıl, cari yıl-200'den veya cari yıldan daha az olmamak kaydıyla (doğum yılı olabilir):

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

3

Java 8 için aşağıdaki kodu kullanın:

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

0

Benim durumumda yukarıdakilerin hiçbiri işe yaramadı. Bu yüzden bir çok çözüm denedikten sonra bir tane buldum ve benim için çalıştı

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

    }

}

Bu yöntem kullanımdan kaldırıldı. Ve bu korkunç sınıf yıllar önce JSR 310'da tanımlanan java.time sınıfları ile tamamlandı . Assylias tarafından Yanıt'daki modern çözüme bakın .
Basil Bourque

-1

Java 8+ sürümünde java.time kütüphanesini kullanabilir (tavsiye edilir) . ISO 8601 , tarih yazmak için standart bir yol belirler: YYYY-MM-DDve java.time.Instantkullanır, bu nedenle (için UTC):

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

PS her durumda (ve almak için kısa Stringdeğil int), Calendardaha iyi görünüyor ve bölgeye duyarlı hale getirilebilir.


Saat diliminin önemli sayısını görmezden geliyorsunuz. Diğer Cevaptaki daha basit çözüme bakın .
Basil Bourque

-2

Her şeyi bir takvim başlatmaya gerek kalmadan Tamsayı matematik kullanarak yapabilirsiniz:

return (System.currentTimeMillis()/1000/3600/24/365.25 +1970);

Yeni yılda bir veya iki saat kapalı olabilir ama bir sorun olduğu izlenimini edinmiyorum?


9
belki elma için mi çalışıyorsun? macworld.com/article/2023580/…
Stefan Paul Noack

vay, bu çok ağır, cagcowboy'un gösterdiği gibi basit tutmayı öneririm.
LStrike

Bu her durumda en iyisi olmayabilir, ancak aşağı oyları hak etmiyor.
JohnnyLambada

-4

Gün / ay / yıl girişiyle çalışmak için kütüphanemdeki özel işlevleri kullanıyorum -

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 ) { 
 ...
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.