我需要将 Java 中的当前年份确定为整数。我可以只使用java.util.Date()
,但它已被弃用。
15 回答
int year = Calendar.getInstance().get(Calendar.YEAR);
不确定这是否符合不设置新日历的标准?(为什么反对这样做?)
使用 Java 8 的时间 API(假设您很高兴在系统的默认时区中获得年份),您可以使用以下Year::now
方法:
int year = Year.now().getValue();
这个最简单的(使用日历,抱歉)是:
int year = Calendar.getInstance().get(Calendar.YEAR);
您还可以使用java.time.YearMonth
(自 Java 8 起)的 2 种方法:
import java.time.YearMonth;
...
int year = YearMonth.now().getYear();
int month = YearMonth.now().getMonthValue();
tl;博士
ZonedDateTime.now( ZoneId.of( "Africa/Casablanca" ) )
.getYear()
时区
Raffi Khatchadourian的回答明智地展示了如何在 Java 8 中使用新的java.time 包。但该答案未能解决时区在确定日期时的关键问题。
int 年 = LocalDate.now().getYear();
该代码取决于 JVM 当前的默认时区。默认区域用于确定今天的日期。例如,请记住,在巴黎午夜过后的那一刻,蒙特利尔的日期仍然是“昨天”。
因此,您的结果可能会因它运行的机器、更改主机操作系统时区的用户/管理员或随时更改 JVM 当前默认值的任何 Java 代码而异。最好指定时区。
顺便说一句,请始终使用IANA 定义的正确时区名称。切勿使用既不标准化也不唯一的 3-4 个字母代码。
java.time
Java 8 的 java.time 中的示例。
int year = ZonedDateTime.now( ZoneId.of( "Africa/Casablanca" ) ).getYear() ;
乔达时间
一些想法如上,但使用Joda-Time 2.7 库。
int year = DateTime.now( DateTimeZone.forID( "Africa/Casablanca" ) ).getYear() ;
递增/递减年份
如果您的目标是一次跳跃一年,则无需提取年份编号。Joda-Time 和 java.time 都有一次加/减一年的方法。这些方法很聪明,可以处理夏令时和其他异常情况。
java.time中的示例。
ZonedDateTime zdt =
ZonedDateTime
.now( ZoneId.of( "Africa/Casablanca" ) )
.minusYears( 1 )
;
Joda-Time 2.7 中的示例。
DateTime oneYearAgo = DateTime.now( DateTimeZone.forID( "Africa/Casablanca" ) ).minusYears( 1 ) ;
最简单的方法是从日历中获取年份。
// year is stored as a static member
int year = Calendar.getInstance().get(Calendar.YEAR);
如果您想要任何日期对象的年份,我使用了以下方法:
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;
}
您还可以使用 Java 8 LocalDate
:
import java.time.LocalDate;
//...
int year = LocalDate.now().getYear();
对 java 8 使用以下代码:
LocalDate localDate = LocalDate.now();
int year = localDate.getYear();
int month = localDate.getMonthValue();
int date = localDate.getDayOfMonth();
如果您的应用程序大量使用 Date 和 Calendar 对象,您真的应该使用 Joda Time,因为java.util.Date
它是可变的。java.util.Calendar
更新其字段时会出现性能问题,并且对于日期时间算术来说很笨拙。
正如上面一些人的回答:
如果以后想使用该变量,最好使用:
int year;
year = Calendar.getInstance().get(Calendar.YEAR);
如果您只需要年份来满足您最好使用的条件:
Calendar.getInstance().get(Calendar.YEAR)
例如,在检查引入年份不小于当前年份 200 或大于当前年份(可能是出生年份)时使用它:
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));
}
在我的情况下,以上都不起作用。所以在尝试了很多解决方案之后,我发现了下面一个,它对我有用
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);
}
}
您可以使用整数数学来完成整个事情,而无需实例化日历:
return (System.currentTimeMillis()/1000/3600/24/365.25 +1970);
新年可能会休息一两个小时,但我不觉得这是个问题?
我在我的库中使用特殊函数来处理日/月/年整数 -
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 ) {
...
}