Я хочу отримати рік, місяць, день тощо від дати Java для порівняння з датою григоріанського календаря на Яві. Чи можливо це?


231

У мене об’єкт Date в Java зберігається як тип дати Java.

У мене також є дата створення григоріанського календаря. Дата григоріанського календаря не має жодних параметрів і тому є примірником сьогоднішньої дати (і часу?).

З датою Java я хочу мати можливість вибору року, місяця, дня, години, хвилини та секунд від типу дати дати і порівняти дату григоріанського календаря.

Я побачив, що наразі дата Java зберігається як довга, і єдині доступні методи, здається, просто записують довгі, як відформатований рядок дати. Чи є доступ до року, місяця, дня тощо?

Я бачив , що getYear(), getMonth()і т.д. методи Dateкласу застаріли. Мені було цікаво, яка найкраща практика використовувати екземпляр Java Date у мене з GregorianCalendarдатою.

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

Я все ще новачок на Java і мене це трохи спантеличує.


1
Ей, що б ти не використовував, не використовуй Date.getYear(). Він страждає від проблем (що я не знаю). Date.getYear()раз розібрав мою дату 30.06.2017, і мій рік повернувся як 117. Подивіться, де він приземлився, дві тисячі років тому. Але коли я просто надрукував об’єкт дати, вихід був Fine.But not Date.getYear();.
— Зенівасан

FYI: Ви використовуєте неспокійні старі класи Дата-часу, які тепер застаріли, замінені сучасними класами java.time.
— Василь Бурк

Відповіді:


545

Використовуйте щось на кшталт:

Date date; // your date
// Choose time zone in which you want to interpret your Date
Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("Europe/Paris"));
cal.setTime(date);
int year = cal.get(Calendar.YEAR);
int month = cal.get(Calendar.MONTH);
int day = cal.get(Calendar.DAY_OF_MONTH);
// etc.

Остерігайтеся, місяці починаються з 0, а не з 1.

Редагувати : З Java 8 краще використовувати java.time.LocalDate, а не java.util.Calendar . Дивіться цю відповідь, як це зробити.


4
Ви можете використовувати cal.add(Calendar.DAY_OF_MONTH, -48)для денної арифметики об’єкти календаря. І ви можете порівняти два об’єкти календаря, використовуючи cal.compareTo(anotherCal).
— Флорент Гійом

1
Блискучий, ура Флорент! Чи означає вищезгадане, що каландр повертатиме оновлені рік та день, секунди, хвилини та секунди, коли використовуються методи отримання календаря? Dave
— daveb

11
Зауважте, що місяць починається з 0, а не з 1 (тобто січень = 0). docs.oracle.com/javase/6/docs/api/java/util/Calendar.html#MONTH
— Стів Куо

10
Чому JAVA так незручно?
— Кімчі Ман

3
Тому що дата та Календар старі та погано розроблені. У Java 8 є набагато кращі об'єкти даних / часу, див. Oracle.com/technetwork/articles/java/…
— Флорент Гійом

88

З Java 8 і пізніших версій ви можете перетворити об’єкт Date в об’єкт LocalDate, а потім легко отримати рік, місяць і день.

Date date = new Date();
LocalDate localDate = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
int year  = localDate.getYear();
int month = localDate.getMonthValue();
int day   = localDate.getDayOfMonth();

Зауважте, що getMonthValue()повертає значення int від 1 до 12.


10
Зараз 2016 рік, я вважаю, що використання LocalDateJava 8 - це найкраще рішення, яке економить ваш час, інше рішення, яке використовує, Calendarі Dateповне проблем.
— AnnieFromTaiwan

2
Чудова відповідь - безумовно, найкраще використовувати java.time і уникати клопітких старих класів побачень . Також зауважте, як ця відповідь мудро вирішує питання часового поясу. Для будь-якого моменту дата змінюється по всьому світу за часовим поясом.
— Василь Бурк

1
На жаль, рівень API 26+ для Android.
— Віктор Калиновський

14

Ви можете зробити щось подібне, це пояснить, як Dateпрацює клас.

String currentDateString = "02/27/2012 17:00:00";
SimpleDateFormat sd = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss");
Date currentDate = sd.parse(currentDateString);

String yourDateString = "02/28/2012 15:00:00";
SimpleDateFormat yourDateFormat = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss");

Date yourDate = yourDateFormat.parse(yourDateString);

if (yourDate.after(currentDate)) {
    System.out.println("After");
} else if(yourDate.equals(currentDate)) {
    System.out.println("Same");
} else {
    System.out.println("Before");
}

Привіт JavaCity, дякую за це. це дуже корисно. На даний момент я намагаюся ухилитися від розбору з рядка дати. Мені потрібно буде зробити цей аналіз згодом, однак коли я можу користувачів моєї програми встановити рік, день та місяць. Я збирався створити рядок для розбору в SimpleDateFormat. Вище сказане дуже корисно, щоб побачити це в дії. Моя дата Java була створена як дата та час з моменту її створення день тому. Зараз я шукаю порівняння з датою григоріанського календаря, яка була створена сьогодні. Щира подяка
— daveb

8
Виправте код ... малі регістри mmвказують хвилини, а великі - MMце місяць року.
— YoYo

12
    Date date = new Date();

    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("EEEE");

    System.out.println("DAY "+simpleDateFormat.format(date).toUpperCase());

    simpleDateFormat = new SimpleDateFormat("MMMM");
    System.out.println("MONTH "+simpleDateFormat.format(date).toUpperCase());

    simpleDateFormat = new SimpleDateFormat("YYYY");
    System.out.println("YEAR "+simpleDateFormat.format(date).toUpperCase());

EDIT: Вихід для date= Fri Jun 15 09:20:21 CEST 2018є:

DAY FRIDAY
MONTH JUNE
YEAR 2018

Якби ви поставили принаймні вихід, люди могли вирішити, чи може це їм бути корисно чи ні, не запускаючи код.
— SantiBailors

6
private boolean isSameDay(Date date1, Date date2) {
    Calendar calendar1 = Calendar.getInstance();
    calendar1.setTime(date1);
    Calendar calendar2 = Calendar.getInstance();
    calendar2.setTime(date2);
    boolean sameYear = calendar1.get(Calendar.YEAR) == calendar2.get(Calendar.YEAR);
    boolean sameMonth = calendar1.get(Calendar.MONTH) == calendar2.get(Calendar.MONTH);
    boolean sameDay = calendar1.get(Calendar.DAY_OF_MONTH) == calendar2.get(Calendar.DAY_OF_MONTH);
    return (sameDay && sameMonth && sameYear);
}

3
    Date queueDate = new SimpleDateFormat("yyyy-MM-dd").parse(inputDtStr);
    Calendar queueDateCal = Calendar.getInstance();
    queueDateCal.setTime(queueDate);
    if(queueDateCal.get(Calendar.DAY_OF_YEAR)==Calendar.getInstance().get(Calendar.DAY_OF_YEAR))
{
    "same day of the year!";
 }

1
Очікується, що відповіді на переповнення стека мають деякі обговорення та пояснення, а не лише фрагменти коду. І ваш код точно міг би використовувати якесь пояснення.
— Василь Бурк

1
FYI - жахливі старі класи дату, такі як java.util.Date, java.util.Calendarі java.text.SimpleDateFormatтепер застарілі , витіснені класами java.time, вбудованими в Java 8 та новіших версій. Дивіться Підручник від Oracle .
— Василь Бурк

2
@Test
public void testDate() throws ParseException {
    long start = System.currentTimeMillis();
    long round = 100000l;
    for (int i = 0; i < round; i++) {
        StringUtil.getYearMonthDay(new Date());
    }
    long mid = System.currentTimeMillis();
    for (int i = 0; i < round; i++) {
        StringUtil.getYearMonthDay2(new Date());
    }
    long end = System.currentTimeMillis();
    System.out.println(mid - start);
    System.out.println(end - mid);
}

public static Date getYearMonthDay(Date date) throws ParseException {
    SimpleDateFormat f = new SimpleDateFormat("yyyyyMMdd");
    String dateStr = f.format(date);
    return f.parse(dateStr);
}

public static Date getYearMonthDay2(Date date) throws ParseException {
    Calendar c = Calendar.getInstance();
    c.setTime(date);
    c.set(Calendar.SECOND, 0);
    c.set(Calendar.MINUTE, 0);
    c.set(Calendar.HOUR_OF_DAY, 0);
    return c.getTime();
}
public static int compare(Date today, Date future, Date past) {
    Date today1 = StringUtil.getYearMonthDay2(today);
    Date future1 = StringUtil.getYearMonthDay2(future);
    Date past1 = StringUtil.getYearMonthDay2(past);
    return today.compare // or today.after or today.before
}

getYearMonthDay2 (рішення календаря) вдесятеро швидше. Тепер у вас є yyyy MM dd 00 00 00, а потім порівняйте, використовуючи date.compare


2

Це може бути простіше

     Date date1 = new Date("31-May-2017");
OR
    java.sql.Date date1 = new java.sql.Date((new Date()).getTime());

    SimpleDateFormat formatNowDay = new SimpleDateFormat("dd");
    SimpleDateFormat formatNowMonth = new SimpleDateFormat("MM");
    SimpleDateFormat formatNowYear = new SimpleDateFormat("YYYY");

    String currentDay = formatNowDay.format(date1);
    String currentMonth = formatNowMonth.format(date1);
    String currentYear = formatNowYear.format(date1);

-2

Будьте уважно, монтуйте починати з 0 не 1. А також використовуйте Календар, використовуючи pm, як я, так що будьте дуже обережні, коли використовуєте Години та хвилини.

Date your_date;
Calendar cal = Calendar.getInstance(); 
cal.setTime(your_date);
int year = cal.get(Calendar.YEAR);
int month = cal.get(Calendar.MINUTE);


1
Краще скористатися сучасним java.time, що витіснить ці клопітні старі спадкові класи, показані тут. Див. Правильну відповідь
— Василь Бурк

Дякую за відповідь та пропозицію. Це дуже краще.
— harun ugur
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.