Изменение календарного времени (java.util.Calendar) - PullRequest
0 голосов
/ 28 января 2012

Можно ли вычесть время из календаря?

например,

.....
Calendar DueTime      = Calendar.getInstance();
Calendar ReminderTime = Calendar.getInstance();

int ReminderMinute = 5;

DueTime.set(DueYear, DueMonth, DueDay, DueHour, DueMinute);

    Day   = Day   - reminderDays   ;
    Day   = Day   - (Week*7)       ;
    Month = Month - reminderMonths ;
    Year  = Year  - reminderYears  ;
    Hour  = Hour  - reminderHours  ;
    Minute= Minute- reminderMinutes;

    ReminderTime.set(Year, Month, Day, Hour, Minute  );
    ReminderTime.add(Calendar.DAY_OF_MONTH , - Day   );
    ReminderTime.add(Calendar.MONTH        , - Month );
    ReminderTime.add(Calendar.YEAR         , - Year  );
    ReminderTime.add(Calendar.HOUR         , - Hour  );
    ReminderTime.add(Calendar.MINUTE       , - Minute);

Если вышеизложенное возможно, другой вопрос, который я хотел бы знать, если ...

reminderDays = 60;

Тогда это также будет в месяце до этого?

Скажите, что это 31-е число месяца, когда наступает срок платежа, и месяц, предшествующий 30 дням, будет ли день напоминания 1-го числа этого месяца?


На другой ноте, котораяrelated:

Я не уверен, прав ли я или нет, но хранит ли экземпляр календаря время в миллисекундах?

например, 1 минута будет равна 600 миллисекундам, а час - 36000 миллисекунд

Так что, если бы я сделал:

ReminderTime.add(Calendar.HOUR         , - 1  );

, все, что он будет делать, это добавить -36000 к общему времени, сохраненному в этом объекте календаря

, так что если это правда, то будет делать:

ReminderTime.add(Calendar.DAY_OF_MONTH , - 60   );

в результате вычитаете 51840000 миллисекунд?Или мне нужно изменить

ReminderTime.add(Calendar.DAY_OF_MONTH , - 60   );

на

ReminderTime.add(Calendar.DAY_OF_YEAR  , - 60   ); 

Это будет после того, как я позвоню:

ReminderTime.set(Year, Month, Day, Hour, Minute  );

Что я ожидаю от этого выше, так это то, что мойдействие вычислит, какой день года является календарным объектом, и удалит из него 51840000 миллисекунд.


Кто-нибудь может помочь?

Три разных вопроса, разделенных строками

Ответы [ 2 ]

2 голосов
/ 28 января 2012

Три вопроса, два утверждения, которые должны позволить вам ответить на них самостоятельно.

1) Да, вы можете вычесть, добавив отрицательное число, как вы написали.

2) Поля нести , точно так же как единицы, десятки, сотни делают.Таким образом, снятие 60 с DAY_OF_MONTH будет перенесено на предыдущий месяц или месяцы или год, если это необходимо.Он настроит календарь на 60 дней

PS 1 минута не 60 миллисекунд!Это 60 х 1000 = 60000 миллисекунд

0 голосов
/ 18 сентября 2017

ТЛ; др

ZonedDateTime.now()
             .minusMonths( 2 )

... против ...

ZonedDateTime.now()
             .minusDays( 60 )

Избегайте устаревших классов даты и времени

Мучительные старые классы даты и времени теперь унаследованы, их заменили классы java.time.

java.time

Да, вы можете легко сделать математику с датами в java.time. Различные классы включают plus… и minus… методы.

Получить текущий момент, как ZonedDateTime.

ZonedDateTime now = ZonedDateTime.now() ;

Лучше указать желаемый / ожидаемый часовой пояс, чем неявно полагаться на текущее значение по умолчанию JVM.

ZoneId z = ZoneId.of( "America/Montreal" ) ;
ZonedDateTime now = ZonedDateTime.now( z ) ;

Вычтите час.

ZonedDateTime zdt = now.minusHour( 1 ) ;

Обратите внимание, что такие аномалии, как переход на летнее время (DST (), обрабатываются автоматически).

Если вы хотите вычесть ровно 60 дней…

ZonedDateTime zdt = now.minusDays( 60 ) ;

Но если бы вы имели в виду два месяца, это была бы другая логика. Прочитайте документацию для точного поведения.

ZonedDateTime zdt = now.minusMonths( 2 ) ;

Вы также можете использовать класс Period для промежутка времени в гранулярности дней-месяцев-лет. Это общие месяцы или календарные дни, а не 24-часовые.

Period twoMonths = Period.ofMonths( 2 ) ;
ZonedDateTime zdt = now.minus( twoMonths ) ;

Если вы хотели представить шестьдесят общих (24-часовых) дней в виде наносекунд, используйте Duration.

Duration d = Duration.ofDays( 60 ) ;
ZonedDateTime zdt = now.minus( d ) ;

Совет. Если вам нужна только часть даты, а не время суток, используйте LocalDate class.


О java.time

Инфраструктура java.time встроена в Java 8 и более поздние версии. Эти классы вытесняют старые классные устаревшие классы даты и времени, такие как java.util.Date, Calendar, & SimpleDateFormat.

Проект Joda-Time , находящийся сейчас в режиме обслуживания , рекомендует перейти на классы java.time .

Чтобы узнать больше, см. Oracle Tutorial . И поиск переполнения стека для многих примеров и объяснений. Спецификация JSR 310 .

Где получить классы java.time?

...