日历添加方法无法按预期工作

时间:2016-01-04 21:53:51

标签: java

我想在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;
    }
}

1 个答案:

答案 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