Java Calendar 的 after 方法返回不一致的结果——有什么想法吗?

标签 java debugging

我在日历的 after 方法中遇到了一个奇怪的错误。下面的代码采用当前时间,并应返回明天的同一时间的日期。当您使用当前时间运行代码时,会发生该错误。知道发生了什么吗?

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Vector;

public class NextDateTest {

    public static void main(String[] args) {

        Vector<Object> setup = new Vector<Object>();
        Calendar dt = Calendar.getInstance();
        SimpleDateFormat hour = new SimpleDateFormat("HH");
        SimpleDateFormat minute = new SimpleDateFormat("mm");

        setup.add(hour.format(dt.getTime()));
        setup.add(minute.format(dt.getTime()));

        for(int a=0; a<11; a++){
            dateTest(setup);
        }

    }

    static void dateTest(Vector<Object> vec){
        Calendar dt = Calendar.getInstance();
        SimpleDateFormat format = new SimpleDateFormat("MM/dd/yyyy HH:mm");
        System.out.println("Old time:" + format.format(dt.getTime()));

        dt.set(Calendar.HOUR_OF_DAY, Integer.valueOf((String) vec.elementAt(0)));
        dt.set(Calendar.MINUTE, Integer.valueOf((String) vec.elementAt(1)));
        System.out.println(Calendar.getInstance().after(dt));
        if(Calendar.getInstance().after(dt)){
            dt.add(Calendar.DAY_OF_YEAR, +1);
        }           
        System.out.println("New time:" + format.format(dt.getTime()));  
    }

}

结果:

Old time:12/19/2011 10:38
true
New time:12/20/2011 10:38
Old time:12/19/2011 10:38
false
New time:12/19/2011 10:38
Old time:12/19/2011 10:38
true
New time:12/20/2011 10:38
Old time:12/19/2011 10:38
false
New time:12/19/2011 10:38
Old time:12/19/2011 10:38
true
New time:12/20/2011 10:38
Old time:12/19/2011 10:38
false
New time:12/19/2011 10:38
Old time:12/19/2011 10:38
false
New time:12/20/2011 10:38
Old time:12/19/2011 10:38
false
New time:12/19/2011 10:38
Old time:12/19/2011 10:38
true
New time:12/20/2011 10:38
Old time:12/19/2011 10:38
false
New time:12/19/2011 10:38
Old time:12/19/2011 10:38
true
New time:12/20/2011 10:38

最佳答案

这不是一个错误。 Calendar.after(...) 执行严格的不等式,并且 Calendar 仅存储毫秒精度。 (就此而言,我什至不确定是否保证在所有系统上都精确到毫秒;我相信某些系统不允许软件访问那么小的时间增量。但是毫秒是典型的。)因此,如果 dateTest(...)Calendar.getInstance() 的两次调用发生在同一毫秒内,则 Calendar.after( ...) 将返回 false,并且 dt.add(Calendar.DAY_OF_YEAR, +1) 将不会执行。

关于Java Calendar 的 after 方法返回不一致的结果——有什么想法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8563905/

相关文章:

java - 使用构建器模式时,为什么我不应该重用构建器对象来访问对象配置?

Java:验证 jar 是否已签名

iOS 应用程序在使用 XCode 调试器启动时崩溃,在没有调试器的情况下运行良好

java - Netbeans with Java 如何查找错误源?

java.lang.NoSuchMethodError : com. google.api.client.http.HttpTransport.isMtls()Z

java - 通过使用 JPA/Hibernate 的方法访问 @Id 字段时防止代理初始化

debugging - C++\CLI 应用程序在加载时崩溃

c - 如何获取导致段错误的行号?

c++ - 如何在 Linux 上使用#ifdef _DEBUG?

java - AsyncTask onPostExecute 未从 doInBackground 返回结果