更改日历时间(java.util.Calendar)

时间:2012-01-28 16:06:13

标签: java android calendar alarmmanager

是否可以从日历中减去时间?

e.g。

.....
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天?


另一个与之相关的说明是:

我不确定我是否对,但日历实例的存储时间是否以毫秒为单位?

e.g。 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 个答案:

答案 0 :(得分:2)

三个问题,两个陈述应该使你能够自己回答。

1)是的,您可以通过添加负数来减去。

2)字段 携带 ,就像单位一样,数十,数百。因此,如果需要,将DAY_OF_MONTH的60分钟带入前一个月或几个月或一年。它会将日历调整60天

P.S。 1分钟不是60毫秒!它是60 x 1000 = 60,000毫秒

答案 1 :(得分:0)

TL;博士

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

如果您打算将60个通用(24小时)天表示为纳秒数,请使用Duration

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

提示:如果您只需要日期部分而不是时间,请使用LocalDate课程。

关于java.time

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

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

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

从哪里获取java.time类?