我在Java的日历上遇到了一些麻烦。我正在从TXT文件中解析一些数据,并且需要创建日期。完成以下代码后:

tmpYear = Double.parseDouble(row[yearIndex]);
tmpMonth = Double.parseDouble(row[monthIndex]);
tmpDay = Double.parseDouble(row[dayIndex]);
if(timeIndex != -1)
    tmpTime = Double.parseDouble(row[timeIndex]);
if(secondsIndex != -1)
    tmpSeconds = Double.parseDouble(row[secondsIndex]);

我可以调试,发现变量如下:tmpyear == 2010
tmpmonth == 12
tmpday == 30
tmptime == 15(这是一天中的时间)
tmpseconds == 0

但是运行以下代码时:

cal.set((int)tmpYear,(int)tmpMonth,(int)tmpDay,(int)tmpTime,
            (int)((tmpTime - (int)tmpTime)*100),(int)tmpSeconds);
System.out.println(cal.getTime().toString());

我得到了输出:
太阳1月30日15:00:00 CST 2011

有人可以解释这是什么可能的原因吗?谢谢大家的帮助!

有帮助吗?

解决方案

月数为0-11而不是1-12。
0 =一月
1 = 2月
...
11 =十二月
利用 tmpMonth = value -1 反而。

其他提示

我相信这个月的价值从0而不是1开始,因此它将0解释为1月1日,为2月...然后1月再次将其解释为12。

来自API:

一个月 - 用于设置一个月时间字段的价值。月值是基于0的。例如,一月0。

设置日历。个月字段时,它基于零。 {1月= 0 ... 12月= 11}

原因很简单:日历API中的设计故障。这就是为什么JSR 310为了改善Java对日期的支持。

从技术上讲,班级的作者认为仅使用静态字段是一件好事。因此,您需要做的是使用以下内容:

calendar = ...
calendar.setMonth(Calendar.JANUARY);

他们不认为人们可能需要动态设置来进行日历,就像您需要的那样(这是我们的大多数人)。

月值从0(1月)到11(12月)。尝试使用((int)tmpmonth)-1设置月份获得十二月。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top