将日历设置为特定日期?

时间:2015-01-08 07:46:34

标签: java android date calendar

我想在特定日期设置提醒通知。然后我正在使用带有NotificationManager的AlarmManager。当我从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);

但它不起作用。

4 个答案:

答案 0 :(得分:2)

约达时间

更新 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 );

答案 1 :(得分:1)

对我而言,这在桌面上运行得很好,无法在Android上测试
更新:刚刚使用AIDE在我的Android手机上对此进行了测试,得到了完全相同的结果。

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

答案 2 :(得分:0)

要通过示例添加一小时,您可以执行以下操作:

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

答案 3 :(得分:0)

TL;博士

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

1420697580000

java.time

现代方法使用 java.time 类来取代麻烦的旧遗留日期时间类。 所以现在更容易和更清洁。

您的代码含糊不清,因为您没有解决时区的关键问题。由于您未明确指定时区,因此将隐式应用JVM的当前默认时区。我强烈建议始终指定您想要的/预期的时区。

continent/region的格式指定proper time zone name,例如America/MontrealAfrica/CasablancaPacific/Auckland。切勿使用诸如ESTIST之类的3-4个字母伪区域,因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。

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.

然后,您可以询问自UTC 1970-01-01T00:00:00Z 1970年第一时刻的纪元参考以来的毫秒数。请注意可能的数据丢失,因为报告仅仅毫秒时将忽略Instant中的任何微秒或纳秒。

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

关于 java.time

java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendar和& SimpleDateFormat

现在位于Joda-Timemaintenance mode项目建议迁移到java.time类。

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310

使用符合JDBC driver或更高版本的JDBC 4.2,您可以直接与数据库交换 java.time 对象。不需要字符串也不需要java.sql。* classes。

从哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuartermore