java.util.Date和getYear()

joh*_*999 52 java date

我在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());
Run Code Online (Sandbox Code Playgroud)

回报

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
Run Code Online (Sandbox Code Playgroud)

我不明白我认为2012年的112位.发生了什么事?是 java.util.Date类不可用?我将其作为一个字段存储在我的几个类中以存储日期和时间.我该怎么办?

小智 71

除了所有的评论之外,我想我可能会根据javadoc添加一些关于如何使用java.util.Date,java.util.Calendar和java.util.GregorianCalendar的代码.

//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);
Run Code Online (Sandbox Code Playgroud)


Pet*_*son 54

根据javadocs:

@Deprecated
public int getYear()
Run Code Online (Sandbox Code Playgroud)

不推荐.从JDK 1.1版开始,替换为Calendar.get(Calendar.YEAR) - 1900.

返回一个值,该值是从包含或以此Date对象表示的时刻开始的年份减去1900的结果,如本地时区中所解释的那样.

返回: 此日期表示的年份减去1900.

另请参阅: 日历

所以112是正确的输出.我会遵循Javadoc中的建议或使用JodaTime.

  • 正确执行一个完全奇怪的规范! (7认同)
  • @jumpnett - 不,这根本不是一个bug,它完全按照预期的方式工作.它将当前年份的偏移量返回到1900年.为什么Sun中的某个人认为这是一个好主意是一个完全不同的问题. (4认同)

Mos*_*iur 31

使用日期格式

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


Kon*_*rin 22

不要使用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
Run Code Online (Sandbox Code Playgroud)

它也支持时间:

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
Run Code Online (Sandbox Code Playgroud)


jqn*_*qno 10

是的,这实际上是正在发生的事情.另见Javadoc:

Returns:
   the year represented by this date, minus 1900.
Run Code Online (Sandbox Code Playgroud)

出于这个原因,不推荐使用getYear方法.所以,不要使用它.

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

你使用JodaTime要好得多.


Amo*_*xit 9

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

Calendar calendar = Calendar.getInstance();
calendar.setTime(new Date());
Run Code Online (Sandbox Code Playgroud)

以下是获取年,月等的示例代码.

System.out.println(calendar.get(Calendar.YEAR));
System.out.println(calendar.get(Calendar.MONTH));
Run Code Online (Sandbox Code Playgroud)

日历还支持许多其他有用的信息,如TIME,DAY_OF_MONTH等.此处列出所有这些信息的文档请注意,月份为0.1月是第0个月.


Geo*_*lou 8

Java 8 LocalDate类是从java.util.Date获取年份的另一种选择,

int year = LocalDate.parse(new SimpleDateFormat("yyyy-MM-dd").format(date)).getYear();
Run Code Online (Sandbox Code Playgroud)

另一种选择是,

int year = Integer.parseInt(new SimpleDateFormat("yyyy").format(date));
Run Code Online (Sandbox Code Playgroud)


Bas*_*que 7

tl; dr

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

2018年

java.time

无论是java.util.Datejava.util.Calendar类是传统的,现在由内置的Java 8和后来的java.time框架所取代。

时区对于确定日期至关重要。在任何给定的时刻,日期都会在全球范围内变化。例如,法国巴黎午夜过后的几分钟是新的一天,而在魁北克蒙特利尔仍然是“昨天” 。

如果未指定时区,则JVM隐式应用其当前的默认时区。该默认值可能随时更改,因此您的结果可能会有所不同。最好将您的期望/期望时区明确指定为参数。

指定适当的时区名称,格式continent/region,如America/MontrealAfrica/CasablancaPacific/Auckland。切勿使用3-4个字母的缩写,例如EST或,IST因为它们不是真实的时区,不是标准化的,甚至不是唯一的(!)。

ZoneId z = ZoneId.of( "Africa/Tunis" ) ;  
Run Code Online (Sandbox Code Playgroud)

如果只需要日期而不是时间,请使用LocalDate。此类缺少时区信息,但是您可以指定时区来确定当前日期。

ZoneId zoneId = ZoneId.of( "America/Montreal" );
LocalDate localDate = LocalDate.now( zoneId );
Run Code Online (Sandbox Code Playgroud)

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

int year = localDate.getYear();
Run Code Online (Sandbox Code Playgroud)

2016年

如果您想要日期时间而不只是日期,请使用ZonedDateTimeclass。

ZonedDateTime zdt = ZonedDateTime.now( zoneId ) ;
Run Code Online (Sandbox Code Playgroud)

关于java.time

java.time框架是建立在Java 8和更高版本。这些类取代的麻烦旧日期,时间类,如java.util.Date.Calendar,和java.text.SimpleDateFormat

现在处于维护模式Joda-Time项目建议迁移到java.time类。

要了解更多信息,请参见Oracle教程。并在Stack Overflow中搜索许多示例和说明。

大部分的java.time功能后移植到Java 6和Java 7的在ThreeTen,反向移植,并进一步用于安卓ThreeTenABP(见如何使用......)。

ThreeTen-额外项目与其他类扩展java.time。该项目为将来可能在java.time中添加内容提供了一个试验场。你可能在这里找到一些有用的类,比如IntervalYearWeekYearQuarter,和更多


小智 7

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);
Run Code Online (Sandbox Code Playgroud)