Câu trả lời:
int year = Calendar.getInstance().get(Calendar.YEAR);
Không chắc chắn nếu điều này đáp ứng với tiêu chí không thiết lập Lịch mới? (Tại sao phe đối lập làm như vậy?)
Calendar.getInstance().get(Calendar.YEAR)
là nguyên tử liên quan đến đồng hồ được thay đổi bên ngoài, và thực hiện synchronized(c)
một trường hợp mới của một biến cục bộ dù sao cũng sẽ rất vô nghĩa ở đây.
import java.util.Calendar
Thời gian sử dụng Java API 8 của (giả sử bạn đang hạnh phúc để có được những năm theo múi giờ mặc định của hệ thống của bạn), bạn có thể sử dụng các Year::now
phương pháp :
int year = Year.now().getValue();
ZoneId
đối số tùy chọn now
thay vì dựa hoàn toàn vào vùng mặc định hiện tại của JVM (có thể thay đổi bất kỳ lúc nào trong thời gian chạy!).
int year = Year.now(ZoneId.of("America/New_York")).getValue();
docs.oracle.com/javase/8/docs/api/java/time/Year.html#now--
Đơn giản nhất (sử dụng Lịch, xin lỗi) là:
int year = Calendar.getInstance().get(Calendar.YEAR);
Ngoài ra còn có API JSR Ngày và Giờ mới , cũng như Joda Time
Cách dễ nhất là lấy năm từ Lịch.
// year is stored as a static member
int year = Calendar.getInstance().get(Calendar.YEAR);
Bạn cũng có thể sử dụng 2 phương thức từ java.time.YearMonth
(Kể từ Java 8):
import java.time.YearMonth;
...
int year = YearMonth.now().getYear();
int month = YearMonth.now().getMonthValue();
Nếu bạn muốn năm của bất kỳ đối tượng ngày nào, tôi đã sử dụng phương pháp sau:
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()
Câu trả lời của Raffi Khatchadourian cho thấy một cách khôn ngoan cách sử dụng gói java.time mới trong Java 8. Nhưng câu trả lời đó không giải quyết được vấn đề quan trọng của múi giờ trong việc xác định ngày.
int năm = LocalDate.now (). getYear ();
Mã đó phụ thuộc vào múi giờ mặc định hiện tại của JVM. Vùng mặc định được sử dụng để xác định ngày hôm nay là ngày nào. Ví dụ, hãy nhớ rằng trong khoảnh khắc sau nửa đêm ở Paris, ngày ở Montréal vẫn là "ngày hôm qua".
Vì vậy, kết quả của bạn có thể thay đổi tùy theo máy chạy trên máy, người dùng / quản trị viên thay đổi múi giờ của hệ điều hành máy chủ hoặc bất kỳ mã Java nào tại bất kỳ thời điểm nào thay đổi mặc định hiện tại của JVM. Tốt hơn để xác định múi giờ.
Nhân tiện, luôn luôn sử dụng tên múi giờ thích hợp theo định nghĩa của IANA . Không bao giờ sử dụng mã 3-4 chữ cái không được tiêu chuẩn hóa hoặc duy nhất.
Ví dụ trong java.time của Java 8.
int year = ZonedDateTime.now( ZoneId.of( "Africa/Casablanca" ) ).getYear() ;
Một số ý tưởng như trên, nhưng sử dụng thư viện Joda-Time 2.7.
int year = DateTime.now( DateTimeZone.forID( "Africa/Casablanca" ) ).getYear() ;
Nếu mục tiêu của bạn là nhảy một năm tại một thời điểm, không cần phải trích xuất số năm. Cả Joda-Time và java.time đều có các phương pháp để cộng / trừ một năm tại một thời điểm. Và những phương pháp đó rất thông minh, xử lý Giờ tiết kiệm ánh sáng ban ngày và các bất thường khác.
Ví dụ trong Joda-Time 2.7.
DateTime oneYearAgo = DateTime.now( DateTimeZone.forID( "Africa/Casablanca" ) ).minusYears( 1 ) ;
tzdata
tập tin dữ liệu cho mình. Bạn có thể kiểm tra lại tập tin. Và bạn có thể thay thế một tzdata lỗi thời trong triển khai Java của bạn. Oracle cung cấp một công cụ cập nhật cho JVM của họ.
Bạn cũng có thể sử dụng Java 8 LocalDate
:
import java.time.LocalDate;
//...
int year = LocalDate.now().getYear();
Như một số người đã trả lời ở trên:
Nếu bạn muốn sử dụng biến sau, sử dụng tốt hơn:
int year;
year = Calendar.getInstance().get(Calendar.YEAR);
Nếu bạn cần một năm cho một điều kiện bạn nên sử dụng tốt hơn:
Calendar.getInstance().get(Calendar.YEAR)
Ví dụ: sử dụng nó trong một lần thực hiện trong khi séc được giới thiệu không nhỏ hơn năm hiện tại - 200 hoặc nhiều hơn năm hiện tại (Có thể là năm sinh):
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));
}
Trong trường hợp của tôi không có cái nào ở trên được làm việc. Vì vậy, sau khi thử rất nhiều giải pháp tôi đã tìm thấy bên dưới một giải pháp và nó hiệu quả với tôi
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);
}
}
Trong phiên bản Java 8+ có thể (khuyên dùng) thư viện java.time . ISO 8601 thiết lập cách tiêu chuẩn để viết ngày: YYYY-MM-DD
và java.time.Instant
sử dụng nó, vì vậy (cho UTC
):
import java.time.Instant;
int myYear = Integer.parseInt(Instant.now().toString().substring(0,4));
PS chỉ trong trường hợp (và rút ngắn để nhận String
, không int
), sử dụng có Calendar
vẻ tốt hơn và có thể được nhận biết theo vùng.
Bạn có thể thực hiện toàn bộ bằng cách sử dụng toán học Integer mà không cần phải khởi tạo lịch:
return (System.currentTimeMillis()/1000/3600/24/365.25 +1970);
Có thể nghỉ một hoặc hai giờ vào năm mới nhưng tôi không có ấn tượng đó là một vấn đề?
Tôi sử dụng các hàm đặc biệt trong thư viện của mình để làm việc với số ngày / tháng / năm -
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
là không phản đối, không phải là của Java 8. Một số phương thức của nó đang bị phản đối nhưng không phải là toàn bộ lớp. Nhưng bạn nên tránh cả haijava.util.Date
vàjava.util.Calendar
vì chúng nổi tiếng là rắc rối, khó hiểu và thiếu sót. Thay vào đó, hãy sử dụng java.time (trong Java 8) hoặc Joda-Time .