Date 和 getYear()

我在 Java 中遇到了以下问题(我看到一些人 在 JavaScript 中也有类似的问题,但我使用的是 Java)

System.out.println(new Date().getYear());
System.out.println(new GregorianCalendar().getTime().getYear());
System.out.println(this.sale.getSaleDate().getYear());
System.out.println(this.sale.getSaleDate().getMonth());
System.out.println(this.sale.getSaleDate().getDate());

报税表

I/System.out( 4274): 112
I/System.out( 4274): 112
I/System.out( 4274): 112
I/System.out( 4274): 1
I/System.out( 4274): 11

我不明白112位,我以为是2012年。 怎么回事 java.util.Date类不能使用? 我把它作为一个字段存储在几个 存储日期和时间。我该怎么办?

308469 次浏览

Javadocs 表示:

@Deprecated
public int getYear()

不推荐 。从 JDK 版本1.1开始,由 Calendar.get(Calendar.YEAR) - 1900代替。

返回一个值,该值是从包含此 Date 对象表示的即时时间(在本地时区中解释)的年份中减去1900的结果。

以这个日期表示的年份,减去1900年。

参见: 日历

因此112是正确的输出。

是的,这就是正在发生的事情。参见 贾瓦多克:

Returns:
the year represented by this date, minus 1900.

由于这个原因,getYear 方法已被弃用,因此,不要使用它。

还要注意,getMonth 返回一个介于0和11之间的数字。因此,this.sale.getSaleDate().getMonth()返回2月的1,而不是2。虽然 java.util.Calendar不会将1900年增加到所有年份,但它确实存在一个月之差的问题。

你最好使用 JodaTime

这种行为在 Java.util 日期-class 文档中有记录:

返回一个值,该值是从年份中减去1900的结果 包含或开始于由此表示的时间的瞬间 对象,在本地时区中解释。

它也被标记为不推荐使用。改为使用 Java.util. 日历

不要使用 Date,使用 Calendar:

// Beware: months are zero-based and no out of range errors are reported
Calendar date = new GregorianCalendar(2012, 9, 5);
int year = date.get(Calendar.YEAR);  // 2012
int month = date.get(Calendar.MONTH);  // 9 - October!!!
int day = date.get(Calendar.DAY_OF_MONTH);  // 5

它也支持时间:

Calendar dateTime = new GregorianCalendar(2012, 3, 4, 15, 16, 17);
int hour = dateTime.get(Calendar.HOUR_OF_DAY);  // 15
int minute = dateTime.get(Calendar.MINUTE);  // 16
int second = dateTime.get(Calendar.SECOND);  // 17

使用日期格式

SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = format.parse(datetime);
SimpleDateFormat df = new SimpleDateFormat("yyyy");
year = df.format(date);

除了所有注释之外,我还想添加一些关于如何使用 java.util 的代码。Date java.util.日历和 java.util。公历根据 Javadoc

//Initialize your Date however you like it.
Date date = new Date();
Calendar calendar = new GregorianCalendar();
calendar.setTime(date);
int year = calendar.get(Calendar.YEAR);
//Add one to month {0 - 11}
int month = calendar.get(Calendar.MONTH) + 1;
int day = calendar.get(Calendar.DAY_OF_MONTH);
        try{
int year = Integer.parseInt(new Date().toString().split("-")[0]);
}
catch(NumberFormatException e){
}

Date 的大部分内容已被废弃。

博士

LocalDate.now()       // Capture the date-only value current in the JVM’s current default time zone.
.getYear()   // Extract the year number from that date.

二零一八年

爪哇时间

java.util.Datejava.util.Calendar类都是遗留类,现在被构建在 Java8和更高版本中的 Java.time 框架所取代。

时区对确定日期至关重要。对于任何给定的时刻,日期在全球各地区不同。例如,在 法国巴黎中午夜后的几分钟是新的一天,而在 魁北克蒙特利尔中仍然是“昨天”。

如果没有指定时区,JVM 将隐式应用其当前默认时区。该默认值可能随时发生变化,因此结果可能会有所不同。最好明确地将所需/所期望的时区指定为参数。

Specify a 正确的时区名称 in the format of continent/region, such as America/Montreal, Africa/Casablanca, or Pacific/Auckland. Never use the 3-4 letter abbreviation such as EST or IST as they are 没有 true time zones, not standardized, and not even unique(!).

ZoneId z = ZoneId.of( "Africa/Tunis" ) ;

如果您只想要没有时间的日期,使用 LocalDate。这个类没有时区信息,但是您可以指定一个时区来确定当前日期。

ZoneId zoneId = ZoneId.of( "America/Montreal" );
LocalDate localDate = LocalDate.now( zoneId );

您可以使用 getYeargetMonthgetDayOfMonth获得各种信息。通过 java.time,您实际上可以得到年份号码!

int year = localDate.getYear();

二零一六年

如果希望使用日期时间而不仅仅是日期,请使用 ZonedDateTime类。

ZonedDateTime zdt = ZonedDateTime.now( zoneId ) ;

关于爪哇时间

爪哇时间框架内置于 Java8及更高版本中。这些类取代了令人讨厌的旧日期时间类,如 java.util.Date.Calendarjava.text.SimpleDateFormat

现在在 维修模式中的 Joda 时间项目建议迁移到 爪哇时间类。

要了解更多,请参阅 Oracle 教程。并搜索堆栈溢出许多例子和解释。

爪哇时间的大部分功能在 310-后端口中回移植到 Java6和 Java7,并进一步适应 三个十分中的 仿生人(参见 如何使用..)。

310-号外项目使用其他类扩展 java.time。这个项目是将来可能添加 java.time 的试验场。您可以在这里找到一些有用的类,比如 IntervalYearWeekYearQuarter更多

Java8LocalDate 类是从 Java.util.Date 获取年份的另一个选项,

int year = LocalDate.parse(new SimpleDateFormat("yyyy-MM-dd").format(date)).getYear();

另一个选择是,

int year = Integer.parseInt(new SimpleDateFormat("yyyy").format(date));

Java 文档建议使用 Calendar 类,而不是这种不推荐的方式 下面是设置日历对象的示例代码

Calendar calendar = Calendar.getInstance();
calendar.setTime(new Date());

下面是获取年份、月份等的示例代码。

System.out.println(calendar.get(Calendar.YEAR));
System.out.println(calendar.get(Calendar.MONTH));

日历还支持许多其他有用的信息,比如 TIME、 DAY _ OF _ MONTH 等等。这里的 文件列出了所有这些信息 请注意,月份是0为基础。一月是0月。

Year.now()

在 Java8 + 中有一种更简单的方法来使用 爪哇时间库:

java.time.Year.now().getValue()

使用默认时区以四位整数返回当前年份。有很多不同时间的 ZoneIds,日历时钟s 的选择,但我认为这是什么你会想要的大部分时间。如果您希望代码看起来更干净(并且不需要任何其他 java.time)。*.Now ()函数,放入:

import static java.time.Year.now;

打电话给:

now().getValue()

如果需要的话。

在 Java 中获取日期、月份和年份的方法有很多。

你可以使用任何-

    Date date1 = new Date();
String mmddyyyy1 = new SimpleDateFormat("MM-dd-yyyy").format(date1);
System.out.println("Formatted Date 1: " + mmddyyyy1);






Date date2 = new Date();
Calendar calendar1 = new GregorianCalendar();
calendar1.setTime(date2);
int day1   = calendar1.get(Calendar.DAY_OF_MONTH);
int month1 = calendar1.get(Calendar.MONTH) + 1; // {0 - 11}
int year1  = calendar1.get(Calendar.YEAR);
String mmddyyyy2 = ((month1<10)?"0"+month1:month1) + "-" + ((day1<10)?"0"+day1:day1) + "-" + (year1);
System.out.println("Formatted Date 2: " + mmddyyyy2);






LocalDateTime ldt1 = LocalDateTime.now();
DateTimeFormatter format1 = DateTimeFormatter.ofPattern("MM-dd-yyyy");
String mmddyyyy3 = ldt1.format(format1);
System.out.println("Formatted Date 3: " + mmddyyyy3);






LocalDateTime ldt2 = LocalDateTime.now();
int day2 = ldt2.getDayOfMonth();
int mont2= ldt2.getMonthValue();
int year2= ldt2.getYear();
String mmddyyyy4 = ((mont2<10)?"0"+mont2:mont2) + "-" + ((day2<10)?"0"+day2:day2) + "-" + (year2);
System.out.println("Formatted Date 4: " + mmddyyyy4);






LocalDateTime ldt3 = LocalDateTime.of(2020, 6, 11, 14, 30); // int year, int month, int dayOfMonth, int hour, int minute
DateTimeFormatter format2 = DateTimeFormatter.ofPattern("MM-dd-yyyy");
String mmddyyyy5 = ldt3.format(format2);
System.out.println("Formatted Date 5: " + mmddyyyy5);






Calendar calendar2 = Calendar.getInstance();
calendar2.setTime(new Date());
int day3  = calendar2.get(Calendar.DAY_OF_MONTH); // OR Calendar.DATE
int month3= calendar2.get(Calendar.MONTH) + 1;
int year3 = calendar2.get(Calendar.YEAR);
String mmddyyyy6 = ((month3<10)?"0"+month3:month3) + "-" + ((day3<10)?"0"+day3:day3) + "-" + (year3);
System.out.println("Formatted Date 6: " + mmddyyyy6);






Date date3 = new Date();
LocalDate ld1 = LocalDate.parse(new SimpleDateFormat("yyyy-MM-dd").format(date3)); // Accepts only yyyy-MM-dd
int day4  = ld1.getDayOfMonth();
int month4= ld1.getMonthValue();
int year4 = ld1.getYear();
String mmddyyyy7 = ((month4<10)?"0"+month4:month4) + "-" + ((day4<10)?"0"+day4:day4) + "-" + (year4);
System.out.println("Formatted Date 7: " + mmddyyyy7);






Date date4 = new Date();
int day5   = LocalDate.parse(new SimpleDateFormat("yyyy-MM-dd").format(date4)).getDayOfMonth();
int month5 = LocalDate.parse(new SimpleDateFormat("yyyy-MM-dd").format(date4)).getMonthValue();
int year5  = LocalDate.parse(new SimpleDateFormat("yyyy-MM-dd").format(date4)).getYear();
String mmddyyyy8 = ((month5<10)?"0"+month5:month5) + "-" + ((day5<10)?"0"+day5:day5) + "-" + (year5);
System.out.println("Formatted Date 8: " + mmddyyyy8);






Date date5 = new Date();
int day6   = Integer.parseInt(new SimpleDateFormat("dd").format(date5));
int month6 = Integer.parseInt(new SimpleDateFormat("MM").format(date5));
int year6  = Integer.parseInt(new SimpleDateFormat("yyyy").format(date5));
String mmddyyyy9 = ((month6<10)?"0"+month6:month6) + "-" + ((day6<10)?"0"+day6:day6) + "-" + (year6);
System.out.println("Formatted Date 9: " + mmddyyyy9);