java - 日历添加方法未按预期工作

标签 java

我想将(公历)日历时间设置为 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/

相关文章:

java - 如何防止两个事件被触发?

java - 重影效应 : Two views on top of each other. 为什么?

java - 如何在Struts 2 Action类中接收由jquery的getJSON()发送的json请求数据?

java - 在 Maven 依赖树中,父依赖项是否覆盖了子项的范围?

java - 将文本转换为语音java代码

java - 将 `@UsingDataSet` 转换为 `@Sql`

java - 在指定时间调用方法

java - 处理 ByteToMessageDecoder 中的异常

java - "Batch update returned unexpected row count from update [0]; actual row count: 2; expected: 1"是什么意思

java - 如何让 Maven 停止尝试从 maven-central-repo 检查来自某个组的工件的更新?