【发布时间】:2015-10-27 11:53:52
【问题描述】:
我的要求是根据日程安排的频率确定下一个日期。 所以如果频率是 DAILY 并且第一个日期是 25-Oct-2015 23:59:59, 下一个截止日期应该正好相隔 24 小时,即 26-Oct-2015 23:59:59
Calendar.add(int field, int amount) 似乎在处理同样的事情 例如:
每日频率 -- calendar.add(Calendar.DATE, 1);
每周频率--calendar.add(Calendar.DATE, 7);
每月频率--calendar.add(Calendar.MONTH, 1);
以下是相同的代码摘要:
public static void main(String[] args) {
Calendar calendar = new GregorianCalendar();
for(int i=0;i<10;i++) {
calendar.add(Calendar.DATE, 1);
System.out.println(calendar.getTime());
}
}
==================================================
Thu Oct 29 17:17:26 IST 2015 -- in all cases diff is 24 hrs
Fri Oct 30 17:17:26 IST 2015
Sat Oct 31 17:17:26 IST 2015
Sun Nov 01 17:17:26 IST 2015
Mon Nov 02 17:17:26 IST 2015
Tue Nov 03 17:17:26 IST 2015
Wed Nov 04 17:17:26 IST 2015
Thu Nov 05 17:17:26 IST 2015
Fri Nov 06 17:17:26 IST 2015
如果 DAILY 频率和服务器位于东部时间 (EDT),add() 会出现一些异常
从 11 月 1 日起,DST 设置更改同样反映在添加中
public static void main(String[] args) {
Calendar calendar = new GregorianCalendar();
calendar.setTimeZone(TimeZone.getTimeZone("US/Eastern"));
for(int i=0;i<10;i++) {
calendar.add(Calendar.DATE, 1);
System.out.println(calendar.getTime());
}
}
-------------------------------------
Wed Oct 28 17:18:14 IST 2015
Thu Oct 29 17:18:14 IST 2015
Fri Oct 30 17:18:14 IST 2015
Sat Oct 31 17:18:14 IST 2015
Sun Nov 01 18:18:14 IST 2015 -- here diff is of 24 + 1 hr
Mon Nov 02 18:18:14 IST 2015
Tue Nov 03 18:18:14 IST 2015
Wed Nov 04 18:18:14 IST 2015 -- else everywhere diff is 24 hours
Thu Nov 05 18:18:14 IST 2015
Fri Nov 06 18:18:14 IST 2015
如果第一个日期是 2015 年 10 月 25 日 23:59:59,在这种情况下,额外的 1 小时班次会导致异常,如下所示 2015 年 10 月 31 日 23:59:59, 下一个日期是 2-Nov-2015 00:59:59
进一步观察代码,发现
// The rest of the fields (week, day or AM_PM fields)
// require time zone offset (both GMT and DST) change
// adjustment.
实际上,服务器位于 EDT 中,我正在关注 I/O 关系。 我只是尝试在 IST 中的本地实例上对其进行调试。
public static void main(String[] args) {
Calendar calendar = new GregorianCalendar();
for(int i=0;i<10;i++) {
calendar.add(Calendar.DATE, 1);
System.out.println(calendar.getTime());
}
}
Wed Oct 28 08:09:48 EDT 2015
Thu Oct 29 08:09:48 EDT 2015
Fri Oct 30 08:09:48 EDT 2015
Sat Oct 31 08:09:48 EDT 2015
Sun Nov 01 08:09:48 EST 2015
Mon Nov 02 08:09:48 EST 2015
Tue Nov 03 08:09:48 EST 2015
Wed Nov 04 08:09:48 EST 2015
Thu Nov 05 08:09:48 EST 2015
Fri Nov 06 08:09:48 EST 2015
什么应该是使用库的可靠方法来确保我生成的日期按正确的顺序。
【问题讨论】:
-
目前坚持使用 java7 :( 顺便说一句,您能否详细说明 java 8 如何解决问题,因为我对此一无所知
-
我认为代码在我看来很好。您尝试调试为 IST 时区,而您已经将其设置为 EST。