342

我需要将 Java 中的当前年份确定为整数。我可以只使用java.util.Date(),但它已被弃用。

4

15 回答 15

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

不确定这是否符合不设置新日历的标准?(为什么反对这样做?)

于 2008-09-25T21:56:41.207 回答
173

使用 Java 8 的时间 API(假设您很高兴在系统的默认时区中获得年份),您可以使用以下Year::now方法

int year = Year.now().getValue();
于 2015-11-13T19:11:12.230 回答
28

这个最简单的(使用日历,抱歉)是:

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

还有新的Date and Time API JSR,以及Joda Time

于 2008-09-25T22:00:04.553 回答
16

您还可以使用java.time.YearMonth(自 Java 8 起)的 2 种方法:

import java.time.YearMonth;
...
int year = YearMonth.now().getYear();
int month = YearMonth.now().getMonthValue();
于 2017-05-23T14:51:36.043 回答
15

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 ) ;
于 2015-05-03T21:42:24.140 回答
14

最简单的方法是从日历中获取年份。

// year is stored as a static member
int year = Calendar.getInstance().get(Calendar.YEAR);
于 2008-09-25T21:58:47.253 回答
10

如果您想要任何日期对象的年份,我使用了以下方法:

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;
}
于 2011-07-20T12:02:38.633 回答
5

您还可以使用 Java 8 LocalDate

import java.time.LocalDate;
//...
int year = LocalDate.now().getYear();
于 2015-03-06T03:24:17.570 回答
5

对 java 8 使用以下代码:

LocalDate localDate = LocalDate.now();
int year = localDate.getYear();
int month = localDate.getMonthValue();
int date = localDate.getDayOfMonth();
于 2019-08-07T09:49:26.870 回答
4

如果您的应用程序大量使用 Date 和 Calendar 对象,您真的应该使用 Joda Time,因为java.util.Date它是可变的。java.util.Calendar更新其字段时会出现性能问题,并且对于日期时间算术来说很笨拙。

于 2008-09-25T22:16:48.070 回答
3

正如上面一些人的回答:

如果以后想使用该变量,最好使用:

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));
}
于 2014-11-24T14:34:16.573 回答
0

在我的情况下,以上都不起作用。所以在尝试了很多解决方案之后,我发现了下面一个,它对我有用

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

    }

}
于 2020-06-11T16:46:46.847 回答
-2

您可以使用整数数学来完成整个事情,而无需实例化日历:

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

新年可能会休息一两个小时,但我不觉得这是个问题?

于 2008-09-26T06:17:50.660 回答
-2

在 Java 版本 8+ 中,可以(建议)使用java.time库。ISO 8601设置了编写日期的标准方法:YYYY-MM-DDjava.time.Instant使用它,所以(对于UTC):

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

PS 以防万一(并且缩写为 get String, not int),使用Calendar看起来更好,并且可以感知区域。

于 2019-11-13T12:46:47.760 回答
-5

我在我的库中使用特殊函数来处理日/月/年整数 -

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 ) { 
 ...
}
于 2008-09-26T04:24:40.947 回答