我想在2016年4月1日开始设置一个(公历)日历时间。我通过设置月,日和年,然后将所有时间字段设置为最小值来实现此目的,给我:< / p>
04/01/2016 12:00:00:000
如果我减去一毫秒,我希望在前一天得到最后一毫秒,但我在同一天得到最后一毫秒:
04/01/2016 11:59:59:999
(注意:如果我减去一秒钟,一分钟或一小时,我会得到类似的结果。)
我错过了什么?示例代码如下,谢谢。 包com.scg.domain;
import java.text.SimpleDateFormat;
import java.util.Calendar;
public class AdHoc
{
private static final int[] UNUSED_CAL_FIELDS =
{
Calendar.HOUR,
Calendar.MINUTE,
Calendar.SECOND,
Calendar.MILLISECOND
};
public static void main(String[] args)
{
Calendar cal = getGoodDate( Calendar.APRIL, 1,2016 );
System.out.println( cal.getCalendarType() );
adjustTime( "present", cal, 0 );
adjustTime( "past", cal, -1 );
adjustTime( "future", cal, 1 );
}
private static void adjustTime( String comment, Calendar cal, int incr )
{
Calendar newCal = Calendar.getInstance();
newCal.setTime( cal.getTime() );
newCal.add( Calendar.MILLISECOND, incr );
SimpleDateFormat fmt =
new SimpleDateFormat( "MM/dd/YYYY HH:mm:ss:SSS" );
System.out.println( comment + ": " + fmt.format( newCal.getTime() ) );
}
private static Calendar getGoodDate( int month, int day, int year )
{
Calendar cal = Calendar.getInstance();
cal.set( Calendar.YEAR, year );
cal.set( Calendar.MONTH, month );
cal.set( Calendar.DAY_OF_MONTH, day );
for ( int field : UNUSED_CAL_FIELDS )
cal.set( field, cal.getMinimum( field ) );
return cal;
}
}
答案 0 :(得分:3)
您使用的是Calendar.HOUR
,它仅控制1-12小时,而不是0-23小时。因此,即使getMinimum
返回0
,它也会被解释为12:00中的任何一个AM或PM cal
已经进入,这必须是来自getInstance()
的PM(返回“现在”)。你真的有中午12点(下午)。当你减去一毫秒时,它仍然是同一天。
要将其设置为午夜,请尝试Calendar.HOUR_OF_DAY
,它控制0-23小时。
通过此更改,我得到输出:
gregory
present: 04/01/2016 00:00:00:000
past: 03/31/2016 23:59:59:999
future: 04/01/2016 00:00:00:001