Как получить месяц как целое число из объекта 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
объекта enum с помощью 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 Tutorial . И поиск переполнения стека для многих примеров и объяснений. Спецификация JSR 310 .
Вы можете обмениваться объектами java.time напрямую с вашей базой данных. Используйте драйвер JDBC, соответствующий JDBC 4.2 или более поздней версии . Нет необходимости в строках, нет необходимости в java.sql.*
классах.
Где взять классы java.time?
Проект ThreeTen-Extra расширяет java.time дополнительными классами. Этот проект является полигоном для возможных будущих дополнений к java.time. Вы можете найти некоторые полезные классы здесь , такие как Interval
, YearWeek
, YearQuarter
, и более .
Если вы не можете использовать время Joda и все еще живете в темном мире :) (Java 5 или ниже), вы можете наслаждаться этим:
Примечание. Убедитесь, что дата уже указана в формате: дд / мм / гггг
/**
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 устарела.