【问题标题】:Get integer value of the current year in Java在Java中获取当前年份的整数值
【发布时间】:2010-09-13 06:42:25
【问题描述】:

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

【问题讨论】:

  • 不,java.util.Date被弃用,在 Java 8 中没有。它的一些方法已被弃用,但不是整个类。但是您应该避免使用java.util.Datejava.util.Calendar,因为它们是出了名的麻烦、混乱和有缺陷的。而是使用java.time(在Java 8 中)或Joda-Time

标签: java datetime date


【解决方案1】:
int year = Calendar.getInstance().get(Calendar.YEAR);

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

【讨论】:

  • 看到您的回答后,日历将是一个很好的使用对象。我一直在寻找单线,但我认为 Calendar 不会为我提供。事实证明我错了!谢谢!
  • 并发怎么办,如果其他线程/库代码改变当前时间怎么办?将其修改为以下内容是否合理: Calendar c = Calendar.getInstance();同步 (c) {c.setTimeInMillis(System.currentTimeMillis());返回 c.get(Calendar.YEAR);}
  • 这会在不同版本的 Android 中返回不同的值。我将 Android v4.1.2 与 v4.2.1 进行比较。
  • @ycnix 代码没有并发问题,所以没有必要让它更复杂。 Calendar.getInstance().get(Calendar.YEAR) 在外部更改时钟方面是原子的,在局部变量的新实例上执行 synchronized(c) 无论如何在这里都毫无意义。
  • import java.util.Calendar
【解决方案2】:

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

// year is stored as a static member
int year = Calendar.getInstance().get(Calendar.YEAR);

【讨论】:

  • Calendar.YEAR 不是当前年份。
  • Calendar.YEAR 是这样定义的... public final static int YEAR = 1;
  • Calendar 上的 get() API 获取位于常量指定字段的数据。年份位于 Calendar 对象的 1 字段中! Calendar.getInstance() 正在获取当前日期。 java.sun.com/j2se/1.4.2/docs/api/java/util/…
  • 这会在不同版本的 Android 中返回不同的值。我将 Android v4.1.2 与 v4.2.1 进行比较。
  • 我用 4.1.2 从手机中取出了我的 SIM 卡。因此网络无法更新手机上的日期和时间。因此手机卡在 2012 年。看起来这不是 4.1.2 中的错误。
【解决方案3】:

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

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

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

【讨论】:

  • 这会在不同版本的 Android 中返回不同的值。我将 Android v4.1.2 与 v4.2.1 进行比较。
  • @toobsco42 - 尝试谷歌搜索“android calendar.year bug”
  • 嘿@toolkit,我一直在做一些研究,但没有运气。我希望得到更具体的答案。
  • 我用 4.1.2 从手机中取出了我的 SIM 卡。因此网络无法更新手机上的日期和时间。因此手机卡在 2012 年。看起来这不是 4.1.2 中的错误。
【解决方案4】:

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

【讨论】:

    【解决方案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 ) { 
     ...
    }
    

    【讨论】:

      【解决方案6】:

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

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

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

      【讨论】:

      • 你在为苹果工作,也许吧? macworld.com/article/2023580/…
      • 哇,这很重,我建议保持简单,就像 cagcowboy 展示的那样。
      • 这可能不是在所有情况下都是最好的,但它不值得被否决。
      【解决方案7】:

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

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

      【讨论】:

      • 结果是 1970!
      【解决方案8】:

      正如上面一些人的回答:

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

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

      【讨论】:

        【解决方案9】:

        你也可以使用 Java 8 的LocalDate:

        import java.time.LocalDate;
        //...
        int year = LocalDate.now().getYear();
        

        【讨论】:

        【解决方案10】:

        tl;博士

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

        【讨论】:

        【解决方案11】:

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

        int year = Year.now().getValue();
        

        【讨论】:

        【解决方案12】:

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

        import java.time.YearMonth;
        ...
        int year = YearMonth.now().getYear();
        int month = YearMonth.now().getMonthValue();
        

        【讨论】:

        • 您错误地复制了很久以前发布的another Answer。你产生了一个与问题无关的月份。而且您忽略了时区的关键问题。而且你的格式很乱。很高兴看到您参与 Stack Overflow。但是这个答案还不够好。编辑以纠正其弱点并添加超出其他答案已经提供的更多价值。或者在它收集反对票之前删除您的答案。附言超级头像图标!
        • 非常感谢。我已经编辑过了。链接和我的方式有点不同
        【解决方案13】:

        对 java 8 使用以下代码:

        LocalDate localDate = LocalDate.now();
        int year = localDate.getYear();
        int month = localDate.getMonthValue();
        int date = localDate.getDayOfMonth();
        

        【讨论】:

          【解决方案14】:

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

          附:以防万一(并且缩写为String,而不是int),使用Calendar 看起来更好,并且可以识别区域。

          【讨论】:

          • 您忽略了时区的关键问题。在other Answer 中查看更简单的解决方案。
          【解决方案15】:

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

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

          【讨论】:

          • 该方法已被弃用。这个可怕的类在几年前被 JSR 310 中定义的 java.time 类所取代。请参阅Answer by assylias 中的现代解决方案。
          • 是的,但我一直在积极寻求解决方案并尝试了许多可用的解决方案,对我来说,这个可行,所以我发布了 :)
          猜你喜欢
          • 1970-01-01
          • 2011-08-25
          • 2014-07-20
          • 1970-01-01
          • 2013-10-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多