2015-01-08 7 views
2

Я хочу установить напоминание с уведомлением на определенную дату. Затем я использую AlarmManager с NotificationManager. Когда я устанавливаю выбранную дату из dateDialog, напоминание работает. Как я могу поместить значение календаря в будильник с фиксированным временем? Я получаю текущую дату и время от этого:Установите календарь на определенную дату?

Calendar calendar = Calendar.getInstance(); 

, а затем я могу установить календарь вручную, как показано ниже, и это работает:

calendar.set(Calendar.SECOND, 0); 
calendar.set(Calendar.MINUTE, 13); 
calendar.set(Calendar.HOUR, 7); 
calendar.set(Calendar.AM_PM, Calendar.AM); 
calendar.set(Calendar.MONTH, Calendar.JANUARY); 
calendar.set(Calendar.DAY_OF_MONTH, 8); 
calendar.set(Calendar.YEAR,2015); 
long when = calendar.getTimeInMillis(); 

Но мой вопрос, как я могу установить календарь на завтра и 9:00 утра или установить календарь точно в конкретный месяц (или год) позже с текущей даты? Я имею в виду примерно следующее:

calendar.add(Calendar.DAY_OF_MONTH, 1); 

но это не работает.

+3

Что означает 'но это не работает'? – Jens

ответ

2

Joda времени

UPDATE: Проект Joda-Time теперь в maintenance mode с командой советуя миграции к классам java.time. См. Tutorial by Oracle.

Попробуйте использовать лучшую библиотеку времени, например, Joda-Time.

В Joda-Time вы можете изменить дату, сохранив время суток. Или, наоборот, держите время суток, сохраняя дату.

DateTime now = DateTime.now(DateTimeZone.forID("America/Montreal")) ; 
DateTime todayNoon = now.withTime(12, 0, 0, 0) ; 
DateTime midMarchSameYearSameTimeAsNow = now.withDate( now.getYear(), DateTimeConstants.MARCH, 15); 
DateTime tomorrowSameTime = now.plusDays(1); 
0

Чтобы добавить час на примере, вы можете сделать что-то вроде этого:

calendar.set(Calendar.HOUR, calendar.get(Calendar.HOUR) + 1); 
1

Для меня это работает просто отлично на рабочем столе, не мог проверить его на Android, хотя.
Обновление: только что проверили это на моем телефоне Android с помощью AIDE, получив точно такие же результаты.

import java.util.Calendar; 

public class CalendarTest { 

    public static void main(String[] args) { 

     Calendar calendar = Calendar.getInstance(); 

     System.out.println(calendar.getTimeInMillis() + " -> " + calendar.getTime()); 

     calendar.set(Calendar.SECOND, 0); 
     calendar.set(Calendar.MINUTE, 13); 
     calendar.set(Calendar.HOUR, 7); 
     calendar.set(Calendar.AM_PM, Calendar.AM); 
     calendar.set(Calendar.MONTH, Calendar.JANUARY); 
     calendar.set(Calendar.DAY_OF_MONTH, 9); 
     calendar.set(Calendar.YEAR, 2015); 

     System.out.println(calendar.getTimeInMillis() + " -> " + calendar.getTime()); 

     calendar.add(Calendar.DAY_OF_MONTH, 1); 
     calendar.add(Calendar.YEAR, 1); 

     System.out.println(calendar.getTimeInMillis() + " -> " + calendar.getTime()); 
    } 

Для этого теста мой выход является только то, что можно было бы ожидать:

1420705649927 -> Thu Jan 08 09:27:29 CET 2015 
1420783980927 -> Fri Jan 09 07:13:00 CET 2015 
1452406380927 -> Sun Jan 10 07:13:00 CET 2016 
+0

ответьте на мой вопрос http://stackoverflow.com/questions/37253122/get-previous-next-day-date-on-button-press-after-getting-date-from-previous-acti – Tara

0

Т.Л., д-р

ZonedDateTime.of(
    LocalDate.of(2015 , Month.JANUARY , 8) , 
    LocalTime.of(7 , 13 , 0) , 
    ZoneId.of("Africa/Tunis") 
) 
.toInstant() 
.toEpochMilli() 

java.time

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

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

Указать proper time zone name в формате continent/region, такие как America/Montreal, Africa/Casablanca или Pacific/Auckland. Никогда не используйте псевдо-зоны 3-4 буквы, такие как EST или IST, так как они не истинные часовые пояса, не стандартизированные, и даже не уникальные (!).

LocalDate ld = LocalDate.of(2015 , Month.JANUARY , 8) ; 
LocalTime lt = LocalTime.of(7 , 13 , 0) ; 
ZoneId z = ZoneId.of("Pacific/Auckland") ; 
ZonedDateTime zdt = ZonedDateTime.of(ld , lt , z) ; 

Вы также можете использовать комбинированный коэффициент.

ZonedDateTime zdt = ZonedDateTime.of(2015 , Month.JANUARY , 8 , 7 , 13 , 0 , 0 , ZoneId.of("Pacific/Auckland")) ; 

Обычно я рекомендую не отслеживать дату-время, как отсчет времени. Но это, по-видимому, требование в вашем случае.

Сначала мы можем извлечь Instant, моментом в UTC. Класс Instant представляет собой момент на временной шкале в UTC с разрешением nanoseconds (до девяти (9) цифр десятичной дроби).

Instant instant = zdt.toInstant() ; // Convert from a zoned value to a UTC value. 

Вы можете задать для подсчета миллисекунд, прошедших после обращения эпохи первого момента 1970 в UTC, 1970-01-01T00: 00: 00Z. Остерегайтесь возможной потери данных, так как любые микросекунды или наносекунды в Instant будут игнорироваться при представлении отчетов за миллисекунды.

long millis = instant.toEpochMilli() ; // Count of milliseconds since 1970-01-01T00:00:00Z. 

О java.time

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

Проект Joda-Time, в настоящее время в maintenance mode, советует перейти на классы java.time.

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

Использование JDBC driver соответствует JDBC 4.2 или более поздней версии, вы можете обменять java.time объекты непосредственно с базой данных. Нет необходимости в строках или классах java.sql. *.

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

  • Java SE 8, Java SE 9, а затем
    • Встроенный.
    • Часть стандартного Java API с объединенной реализацией.
    • Java 9 добавляет некоторые незначительные функции и исправления.
  • Java SE 6 и Java SE 7
    • Большая часть функциональности java.time будет обратно портирован на Java 6 & 7 в ThreeTen-Backport.
  • Android
    • Более поздние версии Android реализаций пачке классов java.time.
    • Для более ранних Android, проект ThreeTenABP адаптируется ThreeTen-Backport (упомянутый выше). См. How to use ThreeTenABP….

ThreeTen-Extra Проект расширяет java.time с дополнительными классами. Этот проект является доказательством возможных будущих дополнений к java.time. Здесь вы можете найти полезные классы, такие как Interval, YearWeek, YearQuarter и more.

Смежные вопросы