tl; dr
Преобразование из ужасных унаследованных классов (Calendar
, GregorianCalendar
и т. Д.) В современные java.time классы (ZonedDateTime
, LocalDate
,так далее.).Затем получите объект для дня недели и попросите его автоматически локализовать имя этого дня недели.
(GregorianCalendar) myJavaUtilCalendar // Cast your `Calendar` to `GregorianCalendar` assuming it actually is one.
.toZonedDateTime() // Convert from legacy class to modern class.
.toLocalDate() // Extract date-only object, without time-of-day and without time zone.
.with( // Adjust to another date by calling `TemporalAdjuster` implementation such as are found in `TemporalAdjusters` class.
TemporalAdjusters.firstDayOfMonth() // Adjust to the first day of the month.
) // Returns another `LocalDate` object, for the first of the month.
.getDayOfWeek() // Obtain a `DayOfWeek` enum object, one of seven pre-defined objects representing each day of the week.
.getDisplayName( // Automatically localize.
TextStyle.FULL , // Specify how long or abbreviated.
Locale.CANADA_FRENCH // Or `Locale.US` etc. to specify the human language and cultural norms to use in localizing.
) // Returns text in a `String` such as “Monday” or “lundi”.
java.time
The java.util.Calendar /.Дата и связанные с ней классы - запутанный беспорядок, поскольку вы выучили трудный путь.
Современный подход использует java.time классы.
Преобразование
Если вы начинаете с объекта java.util.Calendar, преобразуйте его в java.time.
Instant
- это момент на временной шкале в UTC .
Instant instant = myJavaUtilCalendarObject.toInstant();
Применить часовой пояс, чтобы получить дату, чтобы получить день-of-week.
ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = instant.atZone( zoneId );
Обратите внимание, что часовой пояс имеет решающее значение при определении даты (и, следовательно, дня недели).«Сегодня» - это не одна и та же дата во всем мире одновременно.Например, в Париже наступает новый день раньше, чем в Монреале.
Первый день месяца
Давайте перейдем к первому числу месяца, позвонив по номеру withDayOfMonth
.
ZonedDateTime zdtFirstOfMonth = zdt.withDayOfMonth(1);
Обратите внимание, что перемещение даты-времени в первое число месяца имеет проблемы.Такие аномалии, как летнее время (DST), могут иметь неожиданный эффект.Прочитайте документ, чтобы понять поведение.
DayOfWeek
Для дня недели используйте хорошо названное DayOfWeek
enum .
DayOfWeek dayOfWeek = zdtFirstOfMonth.getDayOfWeek();
Я предлагаю передавать экземпляры этого перечисления, а не магическое число , как 2
, 7
и т. Д. Но если вы настаиваете, вы можете извлечь целое число.
int dayOfWeekNumber = dayOfWeek.getValue();
Чтобы получить строку с именем дня недели, пусть java.time сгенерирует локализованную строку с помощью метода getDisplayName
.
String output = dayOfWeek.getDisplayName( TextStyle.FULL , Locale.CANADA_FRENCH ); // Or Locale.ENGLISH
О java.time
Платформа 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
и еще .