Обработка дат Java - PullRequest
       16

Обработка дат Java

4 голосов
/ 21 мая 2010

Учитывая экземпляр java.util.Date, который является воскресеньем. Если в рассматриваемом месяце 4 воскресенья, мне нужно выяснить, является ли выбранная дата

  • 1-е воскресенье месяца
  • 2-е воскресенье месяца
  • 2-е последнее воскресенье месяца
  • Последнее воскресенье месяца

Если в рассматриваемом месяце 5 воскресений, мне нужно выяснить, является ли выбранная дата

  • 1-е воскресенье месяца
  • 2-е воскресенье месяца
  • 3-е воскресенье месяца
  • 2-е последнее воскресенье месяца
  • Последнее воскресенье месяца

Я посмотрел в JodaTime, но пока не нашел соответствующей функциональности там. Проект на самом деле является проектом Groovy, поэтому я мог бы использовать для этого либо Java, либо Groovy.

Спасибо, Донал

Ответы [ 6 ]

4 голосов
/ 21 мая 2010

Решения, данные до сих пор, расскажут вам 1, 2, 3, 4 или 5. Но в вопросе говорилось, что он хочет знать «последний» и «второй до последнего». Если спрашивающий действительно должен знать «последний» и т. Д., Есть немного дополнительной сложности. Вы должны выяснить, сколько воскресений в месяце, чтобы знать, является ли четвертое воскресенье последним. Первый способ понять, что происходит со мной, это:

GregorianCalendar gc=new GregorianCalendar();
gc.setTime(mydate);
gc.set(Calendar.DAY_OF_MONTH,1); // Roll back to first of month
int weekday=gc.get(Calendar.DAY_OF_WEEK); // day of week of first day
// Find day of month of first Sunday
int firstSunday;
if (weekday==Calendar.SUNDAY)
  firstSunday=1;
else
  firstSunday=weekday-Calendar.SUNDAY+6;
// Day of month of fifth Sunday, if it exists
int fifthSunday=firstSunday+7*4;
// Find last day of month
gc.add(Calendar.MONTH,1);
gc.add(Calendar.DATE,-1);
int lastDay=gc.get(DAY_OF_MONTH);

int sundays;
if (fifthSunday<lastDay)
  sundays=4;
else
  sundays=5;

Это похоже на большую работу. Кто-нибудь видит более легкий путь?

2 голосов
/ 21 мая 2010
return dayOfMonth / 7 + 1;

БОЛЬШЕ РЕДАКТИРОВАТЬ

Хорошо, принимая во внимание комментарий Джея, давайте попробуем это:

int sundayId = dayOfMonth / 7 + 1;
if (sundayId == 1) {
    return "1st";
} else if (sundayId == 2) {
    return "2nd";
} else if (sundayId == 3) {
    return ((dayOfMonth + 14 <= daysInMonth) ? "3rd" : "2nd Last");
} else if (sundayId == 4) {
    return ((dayOfMonth + 7 <= daysInMonth) ? "2nd Last" : "Last");
} else {
    return "Last";
}

, тогда как daysInMonth рассчитывается следующим образом:

if (month == 2) {
    if (year % 100) {
        return ((year % 400 == 0) ? 29 : 28);
    } else {
        return ((year % 4 == 0) ? 29 : 28);
    }
} else if (month == 4 || month == 6 || month == 9 || month == 11) {
    return 30;
} else {
    return 31;
}

... или другим способом.

2 голосов
/ 21 мая 2010

DAY_OF_WEEK_IN_MONTH

import java.sql.Date;
import java.util.Calendar;

public class Dow {
    public static void main(String[] args) {
        Date date = new Date( 2010, 4, 1 );
        Calendar cal = Calendar.getInstance();
        cal.setTime( date );
        for ( int week = 0 ; week < 5 ; week++ ) {
            System.out.println( cal.getTime() + " week:" + cal.get( Calendar.DAY_OF_WEEK_IN_MONTH ) );
            cal.add( Calendar.WEEK_OF_MONTH, 1 );
        }
    }
}


> Sun May 01 00:00:00 CEST 3910 week:1
> Sun May 08 00:00:00 CEST 3910 week:2
> Sun May 15 00:00:00 CEST 3910 week:3
> Sun May 22 00:00:00 CEST 3910 week:4
> Sun May 29 00:00:00 CEST 3910 week:5
1 голос
/ 23 мая 2010

РЕДАКТИРОВАТЬ: Вот моя окончательная версия:

today = Calendar.instance
dayOfWeekInMonth = today.get(Calendar.DAY_OF_WEEK_IN_MONTH)

// move to last day of week occurrence in current month
today.set(Calendar.DAY_OF_WEEK_IN_MONTH, -1)
maxDayOfWeekInMonth = today.get(Calendar.DAY_OF_WEEK_IN_MONTH)

dayOfWeekCount = ["1st", "2nd", "3rd", "2nd last", "Last"]

turningPoint = maxDayOfWeekInMonth - 2
if (dayOfWeekInMonth <= turningPoint) {
  println dayOfWeekCount[dayOfWeekInMonth - 1]
}
else {
  // use negative index to access list from last to first
  println dayOfWeekCount[dayOfWeekInMonth - maxDayOfWeekInMonth - 1]
}
1 голос
/ 21 мая 2010

Вы можете просто использовать java.util.Calendar , чтобы вычислить дату:

import java.util.Calendar as CAL

def cal = CAL.getInstance(date)
def isFirst= cal.get(CAL.WEEK_OF_MONTH) == 1
def isSecond = cal.get(CAL.WEEK_OF_MONTH) == cal.getMaximum(CAL.WEEK_OF_MONTH)

Кроме того, не думайте, что в объекте Calendar есть только пять недель в месяце. Например, максимальная неделя 05/01/2010 будет 6.

1 голос
/ 21 мая 2010

int sundayOfMonth = dayOfMonth / 7 + 1;

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