是否可以从日历中减去时间?
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毫秒。
有人可以帮忙吗?
这里有三个不同的问题,用行分隔
答案 0 :(得分:2)
三个问题,两个陈述应该使你能够自己回答。
1)是的,您可以通过添加负数来减去。
2)字段 携带 ,就像单位一样,数十,数百。因此,如果需要,将DAY_OF_MONTH的60分钟带入前一个月或几个月或一年。它会将日历调整60天
P.S。 1分钟不是60毫秒!它是60 x 1000 = 60,000毫秒
答案 1 :(得分:0)
ZonedDateTime.now()
.minusMonths( 2 )
...与...
ZonedDateTime.now()
.minusDays( 60 )
麻烦的旧日期时间类现在已经遗留下来,取而代之的是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 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和& SimpleDateFormat
现在位于Joda-Time的maintenance mode项目建议迁移到java.time类。
要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310。
从哪里获取java.time类?