Показывать еженедельные дни месяца
public static void getWeeksOfMonth(int month, int year)
{
SimpleDateFormat sdf = new SimpleDateFormat("EEEE dd-MMM-yyyy");
Calendar cal = Calendar.getInstance();
cal.set(Calendar.YEAR, year);
cal.set(Calendar.MONTH, month);
cal.set(Calendar.DAY_OF_MONTH, 1);
int ndays = cal.getActualMaximum(Calendar.DAY_OF_MONTH);
System.out.println(ndays+"<<<ff" );
for (int i = 1; i <= ndays; i++)
{
String day = sdf.format(cal.getTime());
System.out.println(day+"<<<" );
Log.e("quest", day+"<<<");
if(i % 7 == 0){
Log.e("question", "=======week days===========");
}
cal.add(Calendar.DATE, 1);
}
}
Выход
Суббота 04-ноя-2017
Воскресенье 05-ноя-2017
Понедельник 06-ноя-2017
Вторник 07-ноя-2017
======= дни недели ===========
Среда 08-ноя-2017
Четверг 09-ноя-2017
Пятница 10 ноября 2017
Суббота, 11 ноября 2017 года
Воскресенье 12-ноя-2017
Понедельник 13-ноя-2017
Вторник, 14 ноября 2017 года
======= дни недели ==========
Среда 15 ноября 2017
Четверг 16 ноября 2017
Пятница 17 ноября 2017
Суббота 18 ноября 2017
Воскресенье 19-ноя-2017
Понедельник 20 ноября 2017
Вторник 21 ноября 2017
======= дни недели ===========
Среда 22 ноября 2017
Четверг, 23 ноября 2017 года
Пятница 24 ноября 2017
Суббота 25 ноября 2017
Воскресенье 26 ноября 2017
Понедельник 27 ноября 2017
Вторник 28 ноября 2017
======= дни недели ===========
Среда 29 ноября 2017
Четверг 30 ноября 2017
1: -Но я хочу завершить на прошлой неделе ср во вторник
2:- начинаются недели с пятницы и заканчиваются четвергом
1 ответ
Используйте java.time
Вы используете ужасные старые классы, которые теперь заменены классами java.time.
YearMonth
класс представляет целый месяц.
YearMonth ym = YearMonth.of( 2018 , Month.JANUARY ) ;
Определите свой формат для выходных строк.
Locale locale = Locale.US ;
DateTimeFormatter f = DateTimeFormatter.ofPattern(
"EEEE dd-MMM-uuuu" ,
locale
) ;
Вместо этого я предлагаю позволить java.time автоматически локализоваться для вас, а не жестко кодировать формат. Для локализации укажите:
FormatStyle
чтобы определить, насколько длинной или сокращенной должна быть строка.Locale
определить:- Человеческий язык для перевода названия дня, названия месяца и тому подобное.
- Культурные нормы, решающие вопросы аббревиатур, заглавных букв, знаков препинания, разделителей и тому подобное.
Определить форматер:
DateTimeFormatter f = DateTimeFormatter.ofLocalizedDate(
FormatStyle.LONG ,
Locale.CANADA_FRENCH
) ;
Собрать в List
возможно.
int initialCapacity = ym.lengthOfMonth() ;
List< String > outputs = new ArrayList<>( initialCapacity ) ;
Цикл по дням.
for( int i = 1 , i <= ym.lengthOfMonth() ; i ++ ) {
LocalDate ld = ym.atDay( i ) ;
String output = ld.format( f ) ;
outputs.add( output ) ;
}
Чтобы сгруппировать их по дням недели, используйте DayOfWeek
ENUM.
DayOfWeek dow = ld.getDayOfWeek() ;
if ( dow.equals( DayOfWeek.WEDNESDAY ) ) { … }
О 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?
- Java SE 8, Java SE 9, Java SE 10 и более поздние версии
- Встроенный.
- Часть стандартного Java API со встроенной реализацией.
- Java 9 добавляет некоторые незначительные функции и исправления.
- Java SE 6 и Java SE 7
- Большая часть функциональности java.time перенесена на Java 6 и 7 в ThreeTen-Backport.
- Android
- Более поздние версии Android связывают реализации классов java.time.
- Для более ранних версий Android (<26) проект ThreeTenABP адаптирует ThreeTen-Backport (упомянутый выше). Смотрите Как использовать ThreeTenABP….