Как определить день недели, передавая определенную дату?
Например, у меня есть дата: "23/2/2010" (23 февраля 2010 г.). Я хочу передать ее функции, которая вернет день недели. Как я могу это сделать?
В этом примере функция должна возвращать String
"Вт".
Кроме того, если требуется просто порядковый номер дня, как его можно получить?
Переведено автоматически
Ответ 1
ДА. В зависимости от вашего конкретного случая:
Вы можете использовать
java.util.Calendar
:Calendar c = Calendar.getInstance();
c.setTime(yourDate);
int dayOfWeek = c.get(Calendar.DAY_OF_WEEK);если вам нужно, чтобы выходные данные были
Tue
, а не 3 (Дни недели индексируются, начиная с 1 для воскресенья, см. Календарь.ВОСКРЕСЕНЬЕ), вместо просмотра календаря, просто переформатируйте строку:new SimpleDateFormat("EE").format(date)
(EE
что означает "день недели, сокращенная версия")если у вас есть входные данные в виде строки, а не
Date
, вам следует использоватьSimpleDateFormat
для их синтаксического анализа:new SimpleDateFormat("dd/M/yyyy").parse(dateString)
вы можете использовать joda-time's
DateTime
и вызыватьdateTime.dayOfWeek()
и / илиDateTimeFormat
.редактировать: начиная с Java 8, теперь вы можете использовать пакет java.time вместо joda-time
Ответ 2
String inputDate = "01/08/2012";
SimpleDateFormat format1 = new SimpleDateFormat("dd/MM/yyyy");
Date dt1 = format1.parse(input_date);
DateFormat format2 = new SimpleDateFormat("EEEE");
String finalDay = format2.format(dt1);
Используйте этот код для поиска названия дня по введенной дате.Простой и хорошо протестированный.
Ответ 3
Просто используйте SimpleDateFormat.
SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy", java.util.Locale.ENGLISH);
Date myDate = sdf.parse("28/12/2013");
sdf.applyPattern("EEE, d MMM yyyy");
String sMyDate = sdf.format(myDate);
Результат: Сб, 28 Дек 2013
Конструктор по умолчанию использует локаль по умолчанию, поэтому будьте осторожны, используя его, когда вам нужен определенный шаблон.
public SimpleDateFormat(String pattern) {
this(pattern, Locale.getDefault(Locale.Category.FORMAT));
}
Ответ 4
tl; dr
Использование java.time…
LocalDate.parse( // Generate `LocalDate` object from String input.
"23/2/2010" ,
DateTimeFormatter.ofPattern( "d/M/uuuu" )
)
.getDayOfWeek() // Get `DayOfWeek` enum object.
.getDisplayName( // Localize. Generate a String to represent this day-of-week.
TextStyle.SHORT_STANDALONE , // How long or abbreviated. Some languages have an alternate spelling for "standalone" use (not so in English).
Locale.US // Or Locale.CANADA_FRENCH and such. Specify a `Locale` to determine (1) human language for translation, and (2) cultural norms for abbreviation, punctuation, etc.
)
Вт
Смотрите, как этот код запускается в режиме реального времени по адресу IdeOne.com (но работает только Locale.US
там).
java.time
Посмотрите мой пример кода выше и правильный ответ для java.time от Przemek.
Порядковый номер
если требуется только порядковый номер дня, как его можно получить?
Вместо порядкового номера рассмотрите возможность передачи DayOfWeek
объекта enum, такого как DayOfWeek.TUESDAY
. Имейте в виду, что a DayOfWeek
- это смарт-объект, а не просто строка или простое целое число. Использование этих объектов enum делает ваш код более самодокументируемым, гарантирует допустимые значения и обеспечивает безопасность типов.
Но если вы настаиваете, спросите DayOfWeek
число. Вы получите 1-7 для понедельника-воскресенья в соответствии со стандартом ISO 8601.
int ordinal = myLocalDate.getDayOfWeek().getValue() ;
Joda-Time
ОБНОВЛЕНИЕ: Проект Joda-Time теперь находится в режиме обслуживания. Команда рекомендует перейти на классы java.time. Фреймворк java.time встроен в Java 8 (а также обратно перенесен на Java 6 и 7 и дополнительно адаптирован для Android).
Вот пример кода с использованием библиотеки Joda-Time версии 2.4, как упомянуто в принятом ответе Божо. Joda-Time намного превосходит java.util.Date /.Классы календаря в комплекте с Java.
LocalDate
Joda-Time предлагает LocalDate
класс для представления только даты без указания времени суток или часового пояса. Именно то, к чему призывает этот вопрос. Старая java.util.Date/.Классы календаря, поставляемые в комплекте с Java, лишены этой концепции.
Разбор
Преобразуем строку в значение даты.
String input = "23/2/2010";
DateTimeFormatter formatter = DateTimeFormat.forPattern( "d/M/yyyy" );
LocalDate localDate = formatter.parseLocalDate( input );
Извлечение
Извлеките из значения даты номер и название дня недели.
int dayOfWeek = localDate.getDayOfWeek(); // Follows ISO 8601 standard, where Monday = 1, Sunday = 7.
Locale locale = Locale.US; // Locale specifies the human language to use in determining day-of-week name (Tuesday in English versus Mardi in French).
DateTimeFormatter formatterOutput = DateTimeFormat.forPattern( "E" ).withLocale( locale );
String output = formatterOutput.print( localDate ); // 'E' is code for abbreviation of day-of-week name. See Joda-Time doc.
String outputQuébécois = formatterOutput.withLocale( Locale.CANADA_FRENCH ).print( localDate );
Дамп
Дамп на консоль.
System.out.println( "input: " + input );
System.out.println( "localDate: " + localDate ); // Defaults to ISO 8601 formatted strings.
System.out.println( "dayOfWeek: " + dayOfWeek );
System.out.println( "output: " + output );
System.out.println( "outputQuébécois: " + outputQuébécois );
Выполнить
При запуске.
input: 23/2/2010
localDate: 2010-02-23
dayOfWeek: 2
output: Tue
outputQuébécois: mar.
О java.time
Платформа java.time встроена в Java 8 и более поздние версии. Эти классы заменяют старые, вызывающие беспокойство, устаревшие классы даты и времени, такие как java.util.Date
, Calendar
, & SimpleDateFormat
.
Проект Joda-Time, который сейчас находится в режиме обслуживания, рекомендует перейти на классы java.time.
Чтобы узнать больше, ознакомьтесь с Руководством по Oracle. И найдите в Stack Overflow множество примеров и пояснений. Спецификация - JSR 310.
Где взять классы java.time?
- Java SE 8, Java SE 9 и более поздние версии
- Встроенный.
- Часть стандартного Java API с комплексной реализацией.
- Java 9 добавляет некоторые незначительные функции и исправления.
- Java SE 6 и Java SE 7
- Большая часть функций java.time перенесена обратно на Java 6 и 7 в трехпозиционном бэкпорте.
- Android
- Проект ThreeTenABP адаптирует ThreeTen-Backport (упомянутый выше) специально для Android.
- Смотрите Как использовать ThreeTenABP ....
Проект ThreeTen-Extra расширяет java.time дополнительными классами. Этот проект является испытательным полигоном для возможных будущих дополнений к java.time. Здесь вы можете найти несколько полезных классов, таких как Interval
, YearWeek
, YearQuarter
и больше.