Отримайте ціле значення поточного року на Java


300

Мені потрібно визначити поточний рік на Java як ціле число. Я міг би просто використовувати java.util.Date(), але це застаріло.


3
Ні, java.util.Dateце НЕ рекомендується, а не з Java 8. Деякі з методів є застарілими , але не весь клас. Але ви повинні уникати як java.util.Dateі java.util.Calendarвони , як відомо , клопітка, заплутані, і недоліки. Замість цього використовуйте або java.time (на Java 8), або Joda-Time .
Василь Бурк

Відповіді:


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

Не впевнені, чи відповідає це критеріям невстановлення нового календаря? (Чому опозиція це робить?)


1
Побачивши вашу відповідь, Календар буде прекрасним предметом для використання. Я шукав однолінійку, і я не думав, що Календар матиме це для мене. Доведено неправильно я! Дякую!
karlgrz

Що з паралельністю, що робити, якщо інший потік / фрагмент бібліотечного коду змінить поточний час? Чи не було б розумним змінити його на щось на кшталт: Calendar c = Calendar.getInstance (); синхронізований (c) {c.setTimeInMillis (System.currentTimeMillis ()); повернути c.get (Calendar.YEAR);}
jnr

1
Це повертає інше значення в різних версіях Android. Я порівнюю Android v4.1.2 з v4.2.1.
toobsco42

2
@ycnix Немає проблем з сумісністю з кодом, тому не потрібно робити його більш складним. Calendar.getInstance().get(Calendar.YEAR) є атомним щодо того, що годинник змінюється зовні, і робити synchronized(c)на новому екземплярі локальну змінну як би там не було дуже безглуздо.
NOS

5
import java.util.Calendar
Домінікас Мостаускіс

139

Використання часу API Java 8 (за умови , що ви щасливі , щоб отримати рік в часовому поясі по замовчуванням вашої системи), ви можете використовувати в Year::nowметоді :

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

7
Я пропоную завжди передавати необов'язковий ZoneIdаргумент, nowа не неявно покладатися на поточну зону за замовчуванням JVM (це може змінитися в будь-який момент під час виконання!).
Василь Бурк

Як виглядає це BTW: int year = Year.now(ZoneId.of("America/New_York")).getValue(); docs.oracle.com/javase/8/docs/api/java/time/Year.html#now--
bcmoney

25

Найпростіший (за допомогою календаря, вибачте):

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

Також є новий JSR API API дати та часу , а також Joda Time


Це повертає інше значення в різних версіях Android. Я порівнюю Android v4.1.2 з v4.2.1.
toobsco42

1
@ toobsco42 - спробуйте googling для 'android Calendar.year bug'
інструментарій

Гей, @toolkit, я не проводив досліджень. Я сподівався на більш конкретну відповідь.
toobsco42

Я вийняв свою SIM-картку з телефону за допомогою 4.1.2. Тому мережа не змогла оновити дату та час по телефону. Отже, телефон застряг у 2012 році. Схоже, це не помилка в 4.1.2.
toobsco42

14

Найпростіший спосіб - це отримати рік з календаря.

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

Calendar.YEAR - це не поточний рік.
інструментарій

Calendar.YEAR визначається таким чином ... public final static int YEAR = 1;
cagcowboy

2
API (() API в календарі отримує дату, яка знаходиться в полі, визначеному константою. Рік розташований у полі 1 в об’єкті Календар! Calendar.getInstance () отримує поточну дату. java.sun.com/j2se/1.4.2/docs/api/java/util/…
Боб Кінг

Це повертає інше значення в різних версіях Android. Я порівнюю Android v4.1.2 з v4.2.1.
toobsco42

Я вийняв свою SIM-картку з телефону за допомогою 4.1.2. Тому мережа не змогла оновити дату та час по телефону. Отже, телефон застряг у 2012 році. Схоже, це не помилка в 4.1.2.
toobsco42

13

Ви також можете скористатися двома методами з java.time.YearMonth(Так як Java 8):

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

Ви неправильно копіювали інший відповідь, опублікований давно. І ви виробляєте місяць, який не має значення для Питання. І ви ігноруєте вирішальне питання часового поясу. А ваше форматування безладне. Я радий бачити, що ви берете участь у Stack Overflow. Але ця відповідь недостатньо хороша. Відредагуйте, щоб виправити його слабкі сторони та додати більше значення, ніж те, що вже надано іншими відповідями. Або видаліть свій відповідь, перш ніж він набере голосів. PS Супер значок аватара!
Василь Бурк

Велике спасибі людино. Я відредагував. посилання трохи інше, ніж мій шлях
Журов Костянтин

10

Якщо ви хочете рік будь-якого об’єкта дати, я застосував такий метод:

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!
Доктор aNdRO

10

тл; д-р

ZonedDateTime.now(  ZoneId.of( "Africa/Casablanca" )  )
             .getYear()

Часовий пояс

Відповідь на Раффі Хачатурян мудро показано , як використовувати новий пакет java.time в Java 8. Але відповідь не вирішує важливе питання про тимчасову зоні при визначенні дати.

int рік = LocalDate.now (). getYear ();

Цей код залежить від поточного часового поясу за замовчуванням JVM. Зона за замовчуванням використовується для визначення того, яка сьогоднішня дата. Пригадайте, наприклад, що в Парижі в моменті після півночі дата в Монреалі все ще є "вчорашньою".

Таким чином, ваші результати можуть відрізнятися залежно від того, на якій машині він працює, користувач / адміністратор, що змінює часовий пояс хост-операційної системи, або будь-який код Java в будь-який момент, змінюючи поточний за замовчуванням JVM. Краще вказати часовий пояс.

До речі, завжди використовуйте належні назви часових поясів, як визначено IANA . Ніколи не використовуйте 3-4 буквених кодів, які не є ні стандартизованими, ні унікальними.

java.time

Приклад у java.time Java 8.

int year = ZonedDateTime.now(  ZoneId.of( "Africa/Casablanca" )  ).getYear() ;

Joda-Time

Деяка ідея, як описано вище, але за допомогою бібліотеки Joda-Time 2.7.

int year = DateTime.now( DateTimeZone.forID( "Africa/Casablanca" ) ).getYear() ;

Рік збільшення / зменшення

Якщо ваша мета - стрибати рік за один раз, не потрібно витягувати номер року. І Joda-Time, і java.time мають методи додавання / віднімання року за один раз. І ці методи розумні, поводження з літним часом та іншими аномаліями.

Приклад у Joda-Time 2.7.

DateTime oneYearAgo = DateTime.now( DateTimeZone.forID( "Africa/Casablanca" ) ).minusYears( 1 ) ;

2
Всі ідентифікатори зони для ледачих (як на мене): mkyong.com/java8/java-display-all-zoneid-and-its-utc-offset
FBB

1
@FBB Я пропоную сторінку Вікіпедії для офіційного списку назв часових поясів IANA . Остерігайтеся: ці зони змінюються напрочуд часто. Якщо ви дійсно хочете , уточнений дані, завантажити нову копію в tzdataфайл даних самостійно. Ви можете ознайомитись з файлом. І ви можете замінити застарілу tzdata у своїй реалізації Java. Oracle надає інструмент оновлення для свого JVM.
Василь Бурк

4

Якщо ваша програма активно використовує об’єкти дати та календаря, ви дійсно повинні використовувати Joda Time, оскільки java.util.Dateце змінне. java.util.Calendarмає проблеми з продуктивністю, коли його поля оновлюються, і незграбна для арифметики дати.



3

Як відповіли деякі люди вище:

Якщо ви хочете використовувати змінну пізніше, краще скористайтеся:

int year;

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

Якщо вам потрібен рік лише для умови, то краще скористайтеся:

Calendar.getInstance().get(Calendar.YEAR)

Наприклад, використовуючи його у виконанні, в той час як введений рік перевірок не менше поточного року-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));
}

3

Використовуйте наступний код для java 8:

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

0

У моєму випадку нічого із зазначеного не працює. Отже, спробувавши багато рішень, я знайшов нижче одного, і він працював на мене

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

    }

}

Цей метод застарілий. І цей жахливий клас був витіснений роками тому класами java.time, визначеними в JSR 310. Дивіться сучасне рішення у відповіді assylias .
Василь Бурк

-1

У версії Java 8+ можна (рекомендується) використовувати бібліотеку java.time . ISO 8601 встановлює стандартний спосіб запису дат: YYYY-MM-DDі java.time.Instantвикористовує його, так (для UTC):

import java.time.Instant;
int myYear = Integer.parseInt(Instant.now().toString().substring(0,4));

PS на всякий випадок (і за короткий час, щоб отримати String, ні int), використання Calendarвиглядає краще і може бути зрозуміло зоні.


Ви ігноруєте вирішальну проблему часового поясу. Дивіться простіше рішення в іншій відповіді .
Василь Бурк

-2

Ви можете зробити все, використовуючи математику Integer, не потребуючи примірника календаря:

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

Можливо, новий рік буде відключений на годину чи дві, але я не відчуваю, що це проблема?


9
Ви працюєте на яблуко, можливо? macworld.com/article/2023580/…
Стефан Пол Ноак

уау, це дуже важко, я б запропонував зберегти це так просто, як це показав cagcowboy.
LStrike

Це може бути не найкращим в будь-яких обставинах, але це не заслуговує голосів.
JohnnyLambada

-4

Я використовую спеціальні функції в моїй бібліотеці для роботи з датами / місяцем / роком -

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 ) { 
 ...
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.