java.util.Date和getYear()

时间:2012-02-11 19:59:21

标签: 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());

返回

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

我不理解我认为2012年的112位。 发生了什么事?是个 java.util.Date类无法使用?我将它存储为几个字段 我的课程存储日期和时间。我该怎么办?

11 个答案:

答案 0 :(得分:57)

除了所有评论之外,我想我可能会根据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);

答案 1 :(得分:52)

根据javadocs:

@Deprecated
public int getYear()

<强>已过时即可。从JDK 1.1版开始,由Calendar.get(Calendar.YEAR) - 1900替换。

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

<强>返回: 这个日期所代表的年份,减去1900年。

另见: Calendar

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

答案 2 :(得分: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);

答案 3 :(得分:21)

请勿使用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

答案 4 :(得分:10)

是的,这实际上是发生了什么。另请参阅Javadoc

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,你会好得多。

答案 5 :(得分:8)

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

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

另一种选择是,

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

答案 6 :(得分:7)

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等。此处documentation列出所有这些信息 请注意,月份为0。 1月是第0个月。

答案 7 :(得分:4)

TL;博士

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

2018

java.time

java.util.Datejava.util.Calendar类都是遗留的,现在由Java 8及更高版本中内置的java.time框架取代。

时区对于确定日期至关重要。对于任何给定的时刻,日期在全球范围内因地区而异。例如,在Paris France午夜后的几分钟是新的一天,而Montréal Québec中仍然是“昨天”。

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

continent/region的格式指定proper time zone name,例如America/MontrealAfrica/CasablancaPacific/Auckland。切勿使用诸如ESTIST之类的3-4字母缩写,因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。

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

2016

如果您想要日期时间而不仅仅是日期,请使用ZonedDateTime类。

ZonedDateTime zdt = ZonedDateTime.now( zoneId ) ;

关于java.time

java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧日期时间类,例如java.util.Date.Calendar和&amp; java.text.SimpleDateFormat

现在位于Joda-Timemaintenance mode项目建议迁移到java.time类。

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。

许多 java.time 功能都被反向移植到Java 6&amp; ThreeTen-Backport中的Java 7并进一步适应Android中的ThreeTenABP(参见How to use…)。

ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuartermore

答案 8 :(得分:1)

java.util.Date - 类文档中记录了此行为:

  

返回一个值,该值是从年份中减去1900的结果   包含或以此为代表的时刻开始   日期对象,在本地时区中解释。

它也被标记为已弃用。请改用java.util.Calendar

答案 9 :(得分:1)

有几种方法可以获取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);

答案 10 :(得分:0)

template "#{prefix}/sudoers" do
  # <snip>
  variables(
    sudoers_groups: node['authorization']['sudo']['groups'],
    # <snip>
  )
end

大部分日期都已弃用。