Odpowiedzi:
int year = Calendar.getInstance().get(Calendar.YEAR);
Nie masz pewności, czy spełnia to kryteria nie konfigurowania nowego kalendarza? (Dlaczego sprzeciw wobec tego?)
Calendar.getInstance().get(Calendar.YEAR)
jest atomowy w odniesieniu do zegara zmienianego zewnętrznie, a wykonywanie synchronized(c)
nowej instancji zmiennej lokalnej byłoby tutaj w ogóle bardzo bezcelowe.
import java.util.Calendar
Korzystanie Java 8 czas API (zakładając, że jesteś szczęśliwy, aby uzyskać dany rok domyślną strefę czasową Twojego systemu), można skorzystać z Year::now
metody :
int year = Year.now().getValue();
ZoneId
argument now
zamiast polegać domyślnie na bieżącej domyślnej strefie JVM (która może się zmienić w dowolnym momencie podczas działania!).
int year = Year.now(ZoneId.of("America/New_York")).getValue();
docs.oracle.com/javase/8/docs/api/java/time/Year.html#now--
Najprościej (przepraszamy za pomocą Kalendarza) jest:
int year = Calendar.getInstance().get(Calendar.YEAR);
Jest też nowa data i godzina API JSR , jak Joda czas
Najłatwiej jest uzyskać rok z kalendarza.
// year is stored as a static member
int year = Calendar.getInstance().get(Calendar.YEAR);
Możesz także użyć 2 metod z java.time.YearMonth
(od Java 8):
import java.time.YearMonth;
...
int year = YearMonth.now().getYear();
int month = YearMonth.now().getMonthValue();
Jeśli chcesz rok dowolnego obiektu daty, użyłem następującej metody:
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()
Odpowiedź przez Raffi Khatchadourian mądrze pokazuje, jak korzystać z nowego pakietu java.time w Javie 8. Ale odpowiedź nie odnosi się do kwestii krytycznej strefy czasowej w celu ustalenia terminu.
int year = LocalDate.now (). getYear ();
Ten kod zależy od bieżącej domyślnej strefy czasowej JVM. Strefa domyślna służy do określania aktualnej daty. Pamiętajcie na przykład, że w chwilę po północy w Paryżu data w Montrealu wciąż jest „wczoraj”.
Dlatego wyniki mogą się różnić w zależności od komputera, na którym działa, użytkownik / administrator zmieniający strefę czasową systemu operacyjnego hosta lub dowolny kod Java w dowolnym momencie zmieniający bieżącą wartość domyślną maszyny JVM. Lepiej określić strefę czasową.
Nawiasem mówiąc, zawsze używać nazw strefy czasowej , jak określone przez IANA . Nigdy nie używaj 3-4 literowych kodów, które nie są ani ustandaryzowane, ani unikalne.
Przykład w java.time Java 8.
int year = ZonedDateTime.now( ZoneId.of( "Africa/Casablanca" ) ).getYear() ;
Jakiś pomysł jak wyżej, ale przy użyciu biblioteki Joda-Time 2.7.
int year = DateTime.now( DateTimeZone.forID( "Africa/Casablanca" ) ).getYear() ;
Jeśli Twoim celem jest przeskakiwanie o jeden rok naraz, nie musisz wyciągać numeru roku. Zarówno Joda-Time, jak i java.time mają metody dodawania / odejmowania rocznie. Te metody są inteligentne, radzą sobie z czasem letnim i innymi anomaliami.
Przykład w Joda-Time 2.7.
DateTime oneYearAgo = DateTime.now( DateTimeZone.forID( "Africa/Casablanca" ) ).minusYears( 1 ) ;
tzdata
pliku danych samodzielnie. Możesz przejrzeć plik. I możesz zastąpić przestarzałe tzdata w swojej implementacji Java. Oracle zapewnia narzędzie aktualizujące dla JVM.
Możesz także użyć Java 8 LocalDate
:
import java.time.LocalDate;
//...
int year = LocalDate.now().getYear();
Jak niektórzy ludzie odpowiedzieli powyżej:
Jeśli chcesz później użyć tej zmiennej, lepiej użyj:
int year;
year = Calendar.getInstance().get(Calendar.YEAR);
Jeśli potrzebujesz roku tylko na stan, lepiej użyj:
Calendar.getInstance().get(Calendar.YEAR)
Na przykład użycie go w czasie, gdy kontrole wprowadzone rok jest nie mniejszy niż bieżący rok 200 lub więcej niż bieżący rok (może być rokiem urodzenia):
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));
}
W moim przypadku żadne z powyższych nie działa. Po wypróbowaniu wielu rozwiązań znalazłem poniżej jednego i zadziałało to dla mnie
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);
}
}
W wersji Java 8+ można (zaleca się) korzystać z biblioteki java.time . ISO 8601 określa standardowy sposób zapisywania dat: YYYY-MM-DD
i java.time.Instant
używa go, więc (dla UTC
):
import java.time.Instant;
int myYear = Integer.parseInt(Instant.now().toString().substring(0,4));
PS na wszelki wypadek (i skrócony do uzyskiwania String
, nie int
), używanie Calendar
wygląda lepiej i można go rozpoznać w strefie.
Możesz zrobić wszystko, używając matematyki Integer, bez konieczności tworzenia kalendarza:
return (System.currentTimeMillis()/1000/3600/24/365.25 +1970);
Mogę odpocząć przez godzinę lub dwie w nowym roku, ale nie mam wrażenia, że to problem?
Korzystam ze specjalnych funkcji w mojej bibliotece do pracy z int / dniami / miesiącami / rokami -
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
jest przestarzałe, nie od wersji Java 8. Niektóre z jego metod są przestarzałe, ale nie cała klasa. Ale należy unikać zarówno i jak są one notorycznie uciążliwe, mylące i błędne. Zamiast tego użyj albo java.time (w Javie 8) lub Joda-Time .java.util.Date
java.util.Calendar