Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Результаты Calendar.roll(Calendar.MONTH, up / down): как возвращаться на "ту же" дату ? / 5 сообщений из 5, страница 1 из 1
27.05.2013, 20:42:07
    #38275471
ozzmosis
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Результаты Calendar.roll(Calendar.MONTH, up / down): как возвращаться на "ту же" дату ?
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
import java.text.DateFormat;
import java.util.Calendar;
import java.util.Locale;
public class LocalizationTest3 {
    public static void main(String[] args) {
        new LocalizationTest3().run();
    }
    void run() {
        Locale ruloc = new Locale("ru","RU");
        DateFormat df = DateFormat.getDateInstance(DateFormat.FULL, ruloc);

        Calendar c = Calendar.getInstance(ruloc);

        c.set(2012, Calendar.JANUARY, 30);
        System.out.println("\nназначили дату: "+df.format(c.getTime()));
        c.roll(Calendar.MONTH, true);
        System.out.println("добавили 1 мес: "+df.format(c.getTime()));
        c.roll(Calendar.MONTH, false);
        System.out.println("отняли:  1 мес  "+df.format(c.getTime()));

        
        c.set(2012, Calendar.JANUARY, 31);
        System.out.println("\nназначили дату: "+df.format(c.getTime()));
        c.roll(Calendar.MONTH, true);
        System.out.println("добавили 1 мес: "+df.format(c.getTime()));
        c.roll(Calendar.MONTH, false);
        System.out.println("отняли:  1 мес  "+df.format(c.getTime()));

        
        c.set(2012, Calendar.MARCH, 31);
        System.out.println("\nназначили дату: "+df.format(c.getTime()));
        c.roll(Calendar.MONTH, true);
        System.out.println("добавили 1 мес: "+df.format(c.getTime()));
        c.roll(Calendar.MONTH, false);
        System.out.println("отняли:  1 мес  "+df.format(c.getTime()));
        
    }
} // end of class LocalizationTest3


Output:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
назначили дату: 30 Январь 2012 г.
добавили 1 мес: 29 Февраль 2012 г.
отняли:  1 мес  29 Январь 2012 г.

назначили дату: 31 Январь 2012 г.
добавили 1 мес: 29 Февраль 2012 г.
отняли:  1 мес  29 Январь 2012 г.

назначили дату: 31 Март 2012 г.
добавили 1 мес: 30 Апрель 2012 г.
отняли:  1 мес  30 Март 2012 г.

Таким обр., roll() при движении туда-и-обратно на одно и тоже число месяцев, может возвращать дату, отличную от исходной.
Дока явы об этом, впрочем, так прямо и говорит:авторWhen rolling on the month or Calendar.MONTH field, other fields like date might conflict and, need to be changed. For instance, rolling the month on the date 01/31/96 will result in 02/29/96
Между тем, методика добавления месяцев с сохранением "адекватного" номера дня давно известна: http://docs.oracle.com/cd/B19306_01/server.102/b14200/functions004.htm ADD_MONTHS( date, integer )
If date is the last day of the month or if the resulting month has fewer days than the day component of date, then the result is the last day of the resulting month. Otherwise, the result has the same day component as date.
Как правильно "скакать" по месяцам в прямом и обратном направлении, чтобы не было показанного выше эффекта ?
...
Рейтинг: 0 / 0
27.05.2013, 20:55:03
    #38275483
ozzmosis
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Результаты Calendar.roll(Calendar.MONTH, up / down): как возвращаться на "ту же" дату ?
PS. мнда, что-то и с "foward-only" вариантом этого самого roll'a не очень красиво:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
        c.set(2012, Calendar.MARCH, 31);
        c.roll(Calendar.MONTH, 1);
        c.roll(Calendar.MONTH, 1);
        c.roll(Calendar.MONTH, 1);
        c.roll(Calendar.MONTH, 1);
        c.roll(Calendar.MONTH, 1);
        c.roll(Calendar.MONTH, 1);
        c.roll(Calendar.MONTH, 1);
        c.roll(Calendar.MONTH, 1);
        c.roll(Calendar.MONTH, 1);
        c.roll(Calendar.MONTH, 1);
        c.roll(Calendar.MONTH, 1);
        c.roll(Calendar.MONTH, 1);
        System.out.println("\nafter roll-12:  "+df.format(c.getTime()));

Output:
Код: plaintext
after roll-12:   29  Март 2012 г.
...
Рейтинг: 0 / 0
27.05.2013, 21:17:30
    #38275513
Usman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Результаты Calendar.roll(Calendar.MONTH, up / down): как возвращаться на "ту же" дату ?
ozzmosisчтобы не было показанного выше эффектаСкорее всего придется корректировать вручную, например, при помощи функции:
Код: java
1.
Calendar.getInstance().getActualMaximum(Calendar.DAY_OF_MONTH)

Возвращает кол-во дней в текущем месяце

P.S.
Нужно поковырять Joda-Time. Может там предусмотрели
...
Рейтинг: 0 / 0
27.05.2013, 21:41:25
    #38275535
Usman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Результаты Calendar.roll(Calendar.MONTH, up / down): как возвращаться на "ту же" дату ?
ozzmosis,

Вроде оно самое (Joda-Time):
Код: java
1.
2.
3.
4.
5.
6.
DateTime dt = new DateTime(2013, 1, 31, 0, 0, 0);
System.out.println(dt);
dt = dt.plusMonths(1).dayOfMonth().withMaximumValue();
System.out.println(dt);
dt = dt.minusMonths(1).dayOfMonth().withMaximumValue();
System.out.println(dt);

Вывод:
Код: java
1.
2.
3.
2013-01-31T00:00:00.000+06:00
2013-02-28T00:00:00.000+06:00
2013-01-31T00:00:00.000+06:00
...
Рейтинг: 0 / 0
27.05.2013, 22:09:07
    #38275552
ozzmosis
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Результаты Calendar.roll(Calendar.MONTH, up / down): как возвращаться на "ту же" дату ?
Usman,

ясно, спасибо.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Результаты Calendar.roll(Calendar.MONTH, up / down): как возвращаться на "ту же" дату ? / 5 сообщений из 5, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]