Як отримати місяць як ціле число з об’єкта Date ( java.util.Date)?
Як отримати місяць як ціле число з об’єкта Date ( java.util.Date)?
Відповіді:
Ви також можете використовувати пакет java.time в Java 8 і перетворити ваш java.util.Dateоб'єкт в java.time.LocalDateоб'єкт, а потім просто скористатися getMonthValue()методом.
Date date = new Date();
LocalDate localDate = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
int month = localDate.getMonthValue();
Зауважте, що значення місяця тут наведені від 1 до 12 всупереч відповіді cal.get(Calendar.MONTH)adarshr, яка дає значення від 0 до 11.
Але, як сказав Василь Бурк у коментарях, кращим способом є отримання Monthоб'єкта перерахунку LocalDate::getMonthметодом.
ZoneId.of( "America/Montreal" ).
Monthenum, а не просто ціле число. Month m = localDate.gotMonth();Дивіться LocalDate::getMonthметод. Використання таких об'єктів робить ваш код самодокументованим, забезпечує безпеку типу та гарантує дійсні значення. Дивіться навчальний посібник Enum від Oracle.
date.toInstant()і у вас трапляється працювати з java.sql.Dateдитиною (дитиною java.util.Date), ви отримаєте UnsupportedOperationException. Спробуйтеnew java.sql.Date(src.getTime()).toLocalDate()
java.sql.Date, використовуючи нові методи перетворення, додані до цього старого класу. java.sql.Date.valueOf( myLocalDate )а myJavaSqlDate.toLocalDate() також драйвери JDBC оновлені для JDBC 4.2 або більш пізньої версії більше не потрібні java.sqlтипи, і можуть безпосередньо адреси java.timeтипів з допомогою ResultSet::getObjectі PreparedStatement::setObjectметоди.
java.util.Date date= new Date();
Calendar cal = Calendar.getInstance();
cal.setTime(date);
int month = cal.get(Calendar.MONTH);
Calendar.MONTHбез видимих причин НЕРО заснований, тобто січень == 0. Тепер це добре зафіксоване в API, але він все ще заплутаний як пекло для користувачів, які вперше вперше. Я ще не можу знайти когось, хто міг би сказати мені, чому вони пішли з цим - можливо, час для нового питання SO так (хоча, я боюся, немає великого передумови для цього: /)
getYear()також, "без видимих причин", віднімається до 1900 року.
Якщо ви використовуєте Java 8 date api, ви можете безпосередньо отримати його в одному рядку!
LocalDate today = LocalDate.now();
int month = today.getMonthValue();
Як варіант, з класом Joda-Time DateTime .
//convert date to datetime
DateTime datetime = new DateTime(date);
int month = Integer.parseInt(datetime.toString("MM"))
… Або…
int month = dateTime.getMonthOfYear();
DateTimeоб'єкт за місяць. int month = dateTime.getMonthOfYear();
.toString("MM")як видно, є більше можливостей, ніж просто "ММ".
DateTimeZoneоб'єкта до цього DateTime конструктору: DateTimeZone.forID( "America/Montreal" ).
myUtilDate.toInstant() // Convert from legacy class to modern. `Instant` is a point on the timeline in UTC.
.atZone( // Adjust from UTC to a particular time zone to determine date. Renders a `ZonedDateTime` object.
ZoneId.of( "America/Montreal" ) // Better to specify desired/expected zone explicitly than rely implicitly on the JVM’s current default time zone.
) // Returns a `ZonedDateTime` object.
.getMonthValue() // Extract a month number. Returns a `int` number.
java.time ДеталіВідповідь Ортомала Локні за використання java.time є правильною. І вам слід використовувати java.time, оскільки це гігантське поліпшення в порівнянні зі старими класами java.util.Date/.Calendar. Дивіться підручник Oracle на java.time.
Я додаю код, який показує, як користуватися java.time, не враховуючи java.util.Date, бо коли ви починаєте із свіжого коду.
Використання java.time в двох словах ... InstantМомент на часовій шкалі в UTC. Застосуйте часовий пояс ( ZoneId), щоб отримати ZonedDateTime.
MonthКлас являє собою складне перерахування для подання в місяць в цілому. Цей перелік має зручні методи, такі як отримання локалізованого імені. І будьте впевнені, що число місяця в java.time є здоровим, 1-12, а не нульовою дурницею (0-11), знайденою в java.util.Date/.Calendar.
Щоб отримати поточну дату та час, важливим є часовий пояс . У будь-який момент дата у світі не однакова. Тому місяць не однаковий у всьому світі, якщо близько кінця / початку місяця.
ZoneId zoneId = ZoneId.of( "America/Montreal" ); // Or 'ZoneOffset.UTC'.
ZonedDateTime now = ZonedDateTime.now( zoneId );
Month month = now.getMonth();
int monthNumber = month.getValue(); // Answer to the Question.
String monthName = month.getDisplayName( TextStyle.FULL , Locale.CANADA_FRENCH );
Java.time каркас вбудований в Java 8 і пізніших версій. Ці класи витісняти неприємні старі застарілі класи дати і часу , такі як java.util.Date, Calendar, і SimpleDateFormat.
Проект Joda-Time , який зараз знаходиться в режимі обслуговування , радить перейти до класів java.time .
Щоб дізнатися більше, дивіться навчальний посібник Oracle . І шукайте переповнення стека за багатьма прикладами та поясненнями. Специфікація - JSR 310 .
Ви можете обмінюватися об'єктами java.time безпосередньо зі своєю базою даних. Використовуйте драйвер JDBC, сумісний з JDBC 4.2 або пізнішої версії. Немає потреби в струнах, немає потреби в java.sql.*заняттях.
Де отримати класи java.time?
Проект ThreeTen-Extra розширює java.time додатковими класами. Цей проект є доказом можливих майбутніх доповнень до java.time. Ви можете знайти деякі корисні класи тут , такі як Interval, YearWeek, YearQuarter, і більш .
Якщо ви не можете використовувати час Joda, і ви все ще живете в темному світі :) (Java 5 або новішої версії), ви можете насолоджуватися цим:
Примітка. Переконайтеся, що ваша дата вже вказана у форматі: dd / MM / GYYY
/**
Make an int Month from a date
*/
public static int getMonthInt(Date date) {
SimpleDateFormat dateFormat = new SimpleDateFormat("MM");
return Integer.parseInt(dateFormat.format(date));
}
/**
Make an int Year from a date
*/
public static int getYearInt(Date date) {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy");
return Integer.parseInt(dateFormat.format(date));
}
Date mDate = new Date(System.currentTimeMillis());
mDate.getMonth() + 1
Повернене значення починається з 0, тому слід додати одне до результату.
new Date()без System.currentTimeMillis. Інша справа, що getMonth застарілий.