Я хочу отримати рік, місяць, день тощо від дати 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.