Як отримати місяць як ціле число з об’єкта 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" )
.
Month
enum, а не просто ціле число. 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 застарілий.