Как получить все даты воскресений в определенном году на Яве? - PullRequest
1 голос
/ 26 февраля 2009

Я серьезно ищу этот код ... Я новый программист.

На самом деле я хочу сделать все даты с флагом, которые все воскресенье в конкретном году.

Пожалуйста, я с нетерпением жду вашего ответа ....

Ответы [ 10 ]

8 голосов
/ 26 февраля 2009

Создать новый календарь. Установите время 1/1 / гггг и некоторое время. Проверьте, является ли текущая дата воскресеньем, и перенесите его на один день, пока это не произойдет. Это первое воскресенье года. Продвиньтесь на 7 дней, пока год не перестанет совпадать, отмечая по ходу.

6 голосов
/ 26 февраля 2009

Внимательно изучите документы java.util.Calendar .

4 голосов
/ 26 февраля 2009

Как-то так должно работать.

int year = 2009;
Calendar cal = new GregorianCalendar(year, Calendar.JANUARY, 1);
for (int i = 0, inc = 1; i < 366 && cal.get(Calendar.YEAR) == year; i+=inc) {
    if (cal.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY) {
        // this is a sunday
        cal.add(Calendar.DAY_OF_MONTH, 7); 
        inc = 7;
    } else {
        cal.add(Calendar.DAY_OF_MONTH, 1);
    }
}
4 голосов
/ 26 февраля 2009

Если бы я делал это, я бы использовал Joda Time , чтобы найти первое воскресенье в году, используя LocalDate. Создайте 1 января, затем добавьте 1 день до воскресенья, затем добавьте 7 дней до конца года.

LocalDate date = new LocalDate(YEAR, 1, 1);
while ( date.dayOfWeek() != 7 )
{
  date = date.addDays(1);
}

while ( date.year() == YEAR )
{
  date = date.addDays(7);
}

Или что-то в этом роде.

2 голосов
/ 01 сентября 2015

java.time

Java 8 и более поздние версии поставляются с новым пакетом java.time. Вдохновлен Joda-Time , определенным JSR 310 , расширенным проектом ThreeTen-Extra . Эти новые классы заменяют общеизвестно хлопотные java.util.Date/.Calendar & java.text.SimpleDateFormat и тому подобное.

Обратите внимание, что мы указываем часовой пояс, важный для определения даты. Например, в Париже новый день наступает раньше, чем в Монреале.

ZoneId zoneId = ZoneId.of( "America/Montreal" );  // Time zone is crucial in determining the date. A new day dawns earlier in Paris than In Montréal, for example.

Вы написали бы этот код, чтобы использовать только LocalDate без какого-либо времени суток. Но в бизнесе полная дата-время часто более полезна. Так что мой пример здесь использует ZonedDateTime.

Чтобы быть аккуратным, я хочу установить время дня в первый момент дня. Можно предположить, что это означает 00:00:00.0, но не всегда из-за таких аномалий, как Летнее время . Чтобы софт-кодировать этот первый момент, мы хотим вызвать метод atStartOfDay, найденный в LocalDate. Итак, мы начинаем с LocalDate, затем используем этот метод для получения ZonedDateTime объекта.

Опять же, обратите внимание, что мы указываем часовой пояс при получении сегодняшней даты. Очень распространенная ошибка - пропуск часового пояса. Если не указан, текущий часовой пояс JVM по умолчанию будет применяться неявно. Это означает, что ваши результаты могут отличаться в зависимости от машины или настроек администратора. Хуже того, любой код в любом потоке любого приложения в этой JVM может вызвать изменение часового пояса по умолчанию в любой момент во время выполнения , пока ваше приложение выполняет ! Поэтому всегда указывайте, а не полагайтесь неявно на текущее значение по умолчанию.

LocalDate today = LocalDate.now( zoneId );  // We want a ZonedDateTime, but starting with a LocalDate in order to get first moment of the day (see next line).
ZonedDateTime todayStart = today.atStartOfDay( zoneId );  // Set time-of-day to first moment of this date, just to be neat. Usually that time is '00:00:00.0' but not always.

Среда java.time включает несколько удобных TemporalAdjustors для получения первого дня года, а оттуда - первого воскресенья этого месяца.

ZonedDateTime firstOfThisYear = todayStart.with( TemporalAdjusters.firstDayOfYear( ) );
ZonedDateTime zdtFirstOfNextYear = firstOfThisYear.with( TemporalAdjusters.firstDayOfNextYear( ) );
ZonedDateTime firstSundayOfThisYear = firstOfThisYear.with( TemporalAdjusters.dayOfWeekInMonth( 1, DayOfWeek.SUNDAY ) );

Теперь мы настроены на цикл по всем неделям года. Мы увеличиваем неделю, пока не окажемся в следующем году. Мы собираем каждое воскресенье в List.

ZonedDateTime zdt = firstSundayOfThisYear; // Var changing throughout loop.
List< ZonedDateTime > sundays = new ArrayList<>( 53 );  // Set initial capacity to maximum number of values.
while ( zdt.isBefore( zdtFirstOfNextYear ) ) {
    // Handle this iteration.
    sundays.add( zdt );
    System.out.println( "Sunday # " + sundays.size( ) + " : " + zdt );
    // Prepare next iteration.
    zdt = zdt.plusWeeks( 1 );
}

При запуске.

Sunday # 1 : 2015-01-04T00:00-05:00[America/Montreal]
Sunday # 2 : 2015-01-11T00:00-05:00[America/Montreal]
…
Sunday # 51 : 2015-12-20T00:00-05:00[America/Montreal]
Sunday # 52 : 2015-12-27T00:00-05:00[America/Montreal]
2 голосов
/ 26 февраля 2009

Это пример кода с использованием java.util.Calendar и java.util.GregorianCalendar, который печатается каждое воскресенье 2009 года. Можно много оптимизировать при форматировании даты, но я оставлю это в качестве упражнения для вас.

import java.util.Calendar;
import java.util.GregorianCalendar;

public class Test
{
    public static void main(String[] args)
    {
        int year =2009;
        int dayOfWeek = Calendar.SUNDAY;
        String dayOfWeekString = "Sunday";
        // instantiate Calender and set to first Sunday of 2009
        Calendar cal = new GregorianCalendar();
        cal.set(2009, 0, 1, 0, 0); cal.getTime();
        cal.set(Calendar.DAY_OF_WEEK, dayOfWeek); cal.getTime();
        int i = 1;
        while (cal.get(Calendar.YEAR) == 2009)
        {
            System.out.println(dayOfWeekString + " " + i + ": " + cal);
            cal.add(Calendar.DAY_OF_MONTH, 7);
            i++;
        }
    }
}

Как видите, использование Joda Time в TiGz намного проще.

1 голос
/ 31 августа 2015
List arrList = new ArrayList();
SimpleDateFormat format1 = new SimpleDateFormat("dd-M-yyyy");
Date date = null;
Calendar cal = Calendar.getInstance();

for (int i = 0; i <= 51; i++) 
{
    try 
    {
        cal.add(Calendar.WEEK_OF_YEAR, +1);
        cal.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY);
        String formatted = format1.format(cal.getTime());
        date = format1.parse(formatted);
        arrList.add(date);
    } catch (Exception e) {
        e.printStackTrace();
    }
}
0 голосов
/ 28 мая 2015

** это даст тебе все воскресенья года **

придумано мной и другом Hemant

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;





public class Test {

    public static void main(String[] args) {



        SimpleDateFormat format =new SimpleDateFormat("dd-MMM-yyyy");
        String DATE_FORMAT = "yyyy MM dd";

        SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT);
        Calendar c1 = Calendar.getInstance(); // today

        String y=sdf.format(c1.getTime());
        String years=y.substring(0,4);
        int year=Integer.parseInt(years);
        //Connection con=null;

        Calendar cal = new GregorianCalendar(year, Calendar.JANUARY, 1);
        for (int i = 0, inc = 1; i <366 && cal.get(Calendar.YEAR) == year; i+=inc) {
            if (cal.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY) {
                // this is a sunday
                String frm="";
                frm=format.format(cal.getTime());
            //System.out.println("From  :"+frm);

                  System.out.println("the value of the sunday is "+format.format(cal.getTime()));
                cal.add(Calendar.DAY_OF_MONTH, 7);   
            } else {
                cal.add(Calendar.DAY_OF_MONTH, 1);
            }






        }
    }
}
0 голосов
/ 30 июня 2014

Я недавно разработал [Lamma Date], который предназначен для использования в подобных случаях.

Следующий код распечатает все воскресенья 2014 года:

List<Date> sundays2014 = Dates.from(2014, 1, 1).to(2014, 12, 31).byWeek().on(DayOfWeek.SUNDAY).build();

for(Date date: sundays2014) {
    System.out.println(date);
}
0 голосов
/ 26 февраля 2009

В году приблизительно 365 дней, поэтому Big-O n вполне управляем. Я бы сказал, просто повторять с начала года до последнего дня года и проверять, является ли каждый день воскресным или нет.

Вам нужно минимум Calendar.get(), Calendar.DAY_OF_WEEK и Calendar.SUNDAY

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...