我想将(公历)日历时间设置为 2016 年 4 月 1 日开始。我通过设置月、日和年来实现此目的,然后将所有时间字段设置为最小值,给出:
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;
}
}
最佳答案
您已使用Calendar.HOUR
,仅控制 1-12 小时,不控制 0-23 小时。因此,即使 getMinimum
返回 0
,它也会被解释为 AM 或 PM cal
中已经存在的 12:00,这必须来自 getInstance()
的 PM(返回“now”)。您确实有中午 12:00 (PM)。减去一毫秒后,仍然是同一天。
要将其设置为午夜,请尝试 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
关于java - 日历添加方法未按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34600561/