【发布时间】:2010-09-13 06:42:25
【问题描述】:
我需要将 Java 中的当前年份确定为整数。我可以只使用java.util.Date(),但它已被弃用。
【问题讨论】:
我需要将 Java 中的当前年份确定为整数。我可以只使用java.util.Date(),但它已被弃用。
【问题讨论】:
int year = Calendar.getInstance().get(Calendar.YEAR);
不确定这是否符合不设置新日历的条件? (为什么反对这样做?)
【讨论】:
Calendar.getInstance().get(Calendar.YEAR) 在外部更改时钟方面是原子的,在局部变量的新实例上执行 synchronized(c) 无论如何在这里都毫无意义。
import java.util.Calendar
最简单的方法是从日历中获取年份。
// year is stored as a static member
int year = Calendar.getInstance().get(Calendar.YEAR);
【讨论】:
这个最简单的(使用日历,抱歉)是:
int year = Calendar.getInstance().get(Calendar.YEAR);
【讨论】:
如果您的应用程序大量使用 Date 和 Calendar 对象,您确实应该使用 Joda Time,因为java.util.Date 是可变的。 java.util.Calendar 在其字段更新时存在性能问题,并且对于日期时间算术来说很笨拙。
【讨论】:
我在我的库中使用特殊函数来处理日/月/年整数 -
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 ) {
...
}
【讨论】:
您可以使用整数数学来完成整个事情,而无需实例化日历:
return (System.currentTimeMillis()/1000/3600/24/365.25 +1970);
新年可能会休息一两个小时,但我不觉得这是个问题?
【讨论】:
如果你想要任何日期对象的年份,我使用了以下方法:
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;
}
【讨论】:
正如上面一些人的回答:
如果以后要使用变量,最好使用:
int year;
year = Calendar.getInstance().get(Calendar.YEAR);
如果您需要年份只是为了更好地使用条件:
Calendar.getInstance().get(Calendar.YEAR)
例如在一个do中使用它,而检查引入的年份不小于当前年份-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));
}
【讨论】:
你也可以使用 Java 8 的LocalDate:
import java.time.LocalDate;
//...
int year = LocalDate.now().getYear();
【讨论】:
ZonedDateTime.now( ZoneId.of( "Africa/Casablanca" ) )
.getYear()
The answer by Raffi Khatchadourian 明智地展示了如何在 Java 8 中使用新的 java.time package。但该答案未能解决时区在确定日期时的关键问题。
int year = LocalDate.now().getYear();
该代码取决于 JVM 当前的默认时区。默认区域用于确定今天的日期。例如,请记住,在巴黎午夜过后的那一刻,蒙特利尔的日期仍然是“昨天”。
因此,您的结果可能会因运行它的机器、用户/管理员更改主机操作系统时区或任何 Java 代码随时更改 JVM 的当前默认值而异。最好指定时区。
顺便说一句,请始终将proper time zone names 用作defined by the 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 都有一次加/减一年的方法。这些方法很聪明,可以处理夏令时和其他异常情况。
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 ) ;
【讨论】:
tzdata data file 的新副本。您可以仔细阅读该文件。您可以在 Java 实现中替换过时的 tzdata。 Oracle 为他们的 JVM 提供了一个updater tool。
使用 Java 8 的时间 API(假设您很高兴在系统的默认时区中获取年份),您可以使用 the Year::now method:
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--
您还可以使用java.time.YearMonth(自Java 8 起)中的两种方法:
import java.time.YearMonth;
...
int year = YearMonth.now().getYear();
int month = YearMonth.now().getMonthValue();
【讨论】:
对 java 8 使用以下代码:
LocalDate localDate = LocalDate.now();
int year = localDate.getYear();
int month = localDate.getMonthValue();
int date = localDate.getDayOfMonth();
【讨论】:
【讨论】:
在我的情况下,以上都不起作用。所以在尝试了很多解决方案后,我发现了下面一个,它对我有用
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);
}
}
【讨论】: