2014-03-19 95 views
1

在这两种情况下,我想在这个例子中米利斯要设置的日期为1395227280627,并且在人类可读的格式是3/19/2014 12:08:00 PM为什么其中一种方法适用于设定日期,另一种方法不适用?

1)这是第一种方法,它不能正常工作:

Calendar ret1=GregorianCalendar.getInstance(); 
ret1.set(Calendar.YEAR, year); 
ret1.set(Calendar.MONTH, month); 
ret1.set(Calendar.DAY_OF_YEAR, day); 
ret1.set(Calendar.HOUR_OF_DAY, hour); 
ret1.set(Calendar.MINUTE, minute); 
ret1.set(Calendar.SECOND, 0); 
Log.e("Time in millis:", Long.toString(ret1.getTimeInMillis())); 

这种方法的输出是毫秒为1390129680626,而人类可读格式为1/19/2014 12:08:00 PM。问题是,这个月没有正确设置。

2)第二种方法,其正确的工作原理是:

Calendar ret2=GregorianCalendar.getInstance(); 
ret2.set(year, month, day, hour, minute, 0); 
Log.e("Time in millis:", Long.toString(ret2.getTimeInMillis())); 

这种方法的输出是1395227280627以毫秒计,并且在人类可读的格式3/19/2014 12:08:00 PM,所以我想要什么。我很好奇哪里出了问题,经过一番研究,大量的人工智能表明Java日历非常糟糕,并且有很多非常奇怪的事情,包括一些破碎的部分。我已经开始走回头路,其工作方式方法,下面是结果:

回溯calendar.set(year, month, day, hour, minute, second)

/** 
* Sets the year, month, day of the month, hour of day, minute, and second fields. 
* Other fields are not changed; call {@link #clear} first if this is not desired. 
* The month value is 0-based, so it may be clearer to use a constant like {@code JANUARY}. 
*/ 
public final void set(int year, int month, int day, int hourOfDay, int minute, int second) { 
    set(year, month, day, hourOfDay, minute); 
    set(SECOND, second); 
} 

所以second部分转化为正是我在第一种方法一样,检查。

回溯calendar.set(year, month, day, hourOfDay, minute)

/** 
* Sets the year, month, day of the month, hour of day, and minute fields. 
* Other fields are not changed; call {@link #clear} first if this is not desired. 
* The month value is 0-based, so it may be clearer to use a constant like {@code JANUARY}. 
*/ 
public final void set(int year, int month, int day, int hourOfDay, int minute) { 
    set(year, month, day); 
    set(HOUR_OF_DAY, hourOfDay); 
    set(MINUTE, minute); 
} 

所以hourOfDayminute部分转化为正是我在第一种方法一样,检查。

回溯calendar.set(year, month, day)

/** 
* Sets the year, month, and day of the month fields. 
* Other fields are not changed; call {@link #clear} first if this is not desired. 
* The month value is 0-based, so it may be clearer to use a constant like {@code JANUARY}. 
*/ 
public final void set(int year, int month, int day) { 
    set(YEAR, year); 
    set(MONTH, month); 
    set(DATE, day); 
} 

所以yearmonthday部分恰好转化为我在第一种方法一样。

结论是,我在第一种方法中所做的每个调用都以完全相同的方式在第二种方法中调用,所以我不明白,发生了什么。任何人都可以帮助我解决这个问题,并解释为什么会发生这种情况?

回答

4

我认为这个问题是您使用了错误的日历设置了当天

ret1.set(Calendar.DAY_OF_YEAR, day); 

其中1-365之间的对应一个数(即设置为19会有效集中一个月的1月19日)

我想你想

ret1.set(Calendar.DAY_OF_MONTH, day); 
+0

哦,上帝,我多么愚蠢是...这完全溜过去,谢谢。 – hundeva

相关问题