Answers:
int year = Calendar.getInstance().get(Calendar.YEAR);
不知道这是否符合不设置新日历的标准?(为什么反对这样做?)
Calendar.getInstance().get(Calendar.YEAR)
关于时钟在外部更改是原子的,并且在synchronized(c)
本地变量的新实例上执行操作在此毫无意义。
import java.util.Calendar
使用Java 8的时间API(假设您很高兴在系统的默认时区中获得年份),可以使用以下Year::now
方法:
int year = Year.now().getValue();
ZoneId
参数传递给,now
而不是隐式依赖JVM当前的默认区域(在运行时随时可以更改!)。
int year = Year.now(ZoneId.of("America/New_York")).getValue();
docs.oracle.com/javase/8/docs/api/java/time/Year.html#now--
最简单的方法(使用日历,抱歉)是:
int year = Calendar.getInstance().get(Calendar.YEAR);
最简单的方法是从日历获取年份。
// year is stored as a static member
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();
ZonedDateTime.now( ZoneId.of( "Africa/Casablanca" ) )
.getYear()
答案由拉菲Khatchadourian明智地展示了如何使用新的java.time包中的Java 8.但是这个答案未能解决时区的关键问题在确定的日期。
int年= LocalDate.now()。getYear();
该代码取决于JVM的当前默认时区。默认区域用于确定今天的日期。例如,请记住,在巴黎的午夜之后,蒙特利尔的日期仍然是“昨天”。
所以,你的结果可能会受到什么样的机器改变它运行时,用户/管理员更改主机操作系统的时区,或任何Java代码在任何时刻改变JVM的当前默认值。最好指定时区。
顺便说一句,一定要使用正确的时区的名称作为由IANA规定。切勿使用既非标准化也不独特的3-4个字母代码。
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都有一次添加/减去一年的方法。这些方法很聪明,可以处理夏时制和其他异常情况。
Joda-Time 2.7中的示例。
DateTime oneYearAgo = DateTime.now( DateTimeZone.forID( "Africa/Casablanca" ) ).minusYears( 1 ) ;
tzdata
数据文件自己。您可以仔细阅读文件。而且,您可以在Java实现中替换过时的tzdata。Oracle 为其JVM 提供了一个更新程序工具。
您还可以使用Java 8 LocalDate
:
import java.time.LocalDate;
//...
int year = LocalDate.now().getYear();
正如一些人回答的那样:
如果以后要使用该变量,请更好地使用:
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);
}
}
您可以使用Integer数学完成整个操作,而无需实例化日历:
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 ) {
...
}
java.util.Date
是不是过时了,没有像Java 8的一些方法被弃用,但不是整个类。但是您应该避免两者都使用java.util.Date
,java.util.Calendar
因为它们众所周知是麻烦,混乱和有缺陷的。而是使用java.time(在Java 8中)或Joda-Time。