![](/img/trans.png)
[英]JasperReports Server: Getting “java.util.GregorianCalendar not configured” error when using java.util.Calendar at scriptlet
[英]java.util.GregorianCalendar issue with add() when applying DST changes
我的要求是根据时间表的频率确定下一个日期。 因此,如果频率为“每天”,且第一个日期为2015年10月25日23:59:59,则下一个截止日期应恰好相隔24小时,即2015年10月26日23:59:59
Calendar.add(int field,int amount)似乎正在处理相同的Eg:
每日频率-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
如果每天的频率和服务器处于东部时间(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,那么在这种情况下,由于2015年10月31日23:59:59之后,额外的1小时轮班会导致异常,下一个日期是2月2日- 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
使用库来确保我生成的日期按正确顺序应该是一种可靠的方式。
试试下面的代码。 下面的代码并非简单地在DAY或MONTH中加1。 为了获得正确的结果,它将一天增加毫秒。
public static void main(String[] args) {
DateFormat formatter = new SimpleDateFormat("EEE MMM dd hh:mm:ss z yyyy");
Calendar calendar = Calendar.getInstance();
formatter.setTimeZone(TimeZone.getTimeZone("US/Eastern"));
calendar.setTimeInMillis(System.currentTimeMillis());
long time = calendar.getTimeInMillis();
for(int i=0;i<10;i++) {
System.out.println(formatter.format(calendar.getTime()));
time = time + 86400000;
calendar.setTimeInMillis(time);
}
}
日期的绝对格式可以通过更改以下行来更改-
new SimpleDateFormat("E MMM dd hh:mm:ss z yyyy");
它给出输出-
Di Okt 27 EDT 2015年8月15:59:59
Mi Okt 2015年夏令时28:15:59
Do Okt 29 EDT 2015
Ft Okt 30美国东部夏令时间08 08:15:59
美国东部时间2015年10月31日08:15:59
因此,美国东部时间2015年11月1日07:15:59
Mo十一月02 07:15:59 EST 2015
Di Nov 03 07:15:59 EST 2015
Mi十一月04 07:15:59 EST 2015
2015年11月5日上午07:15:59做
我认为异常是因为当天(10月31日晚上)美国东部夏令时间结束。 由于印度没有夏令时,因此IST不会发生此类问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.