这段代码的时间问题

时间:2011-05-17 22:32:59

标签: java

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

public class test {

    /*
     * Calculate the difference between two date/times   * 
     * 
     */

    private static long dateDiff(Date toDate, Date fromDate) {
        Calendar cal = Calendar.getInstance();
        cal.setTime(toDate);
        long ms = cal.getTimeInMillis();
        cal.setTime(fromDate);
        ms -= cal.getTimeInMillis();
        return ms;
    }

    public static void main(String[] args) {

        SimpleDateFormat sdf = new SimpleDateFormat("hh:mm:ss");
        Date d1 = null;
        Date d2 = null;

        try {
            d1 = sdf.parse("11:00:00");
            d2 = sdf.parse("10:00:00");
        } catch (Exception e) {
            e.printStackTrace();
        }

        long result = dateDiff(d1, d2);

        Date time = new Date(result);

        System.out.println(time);
    }
}

当我运行它时,我得到了这个结果:

Thu Jan 01 02:00:00 CET 1970

我希望1小时的差异?!再次出现Timezone的问题?

我知道如何解决它。

全部

4 个答案:

答案 0 :(得分:3)

我不知道您的期望是什么,但您实际上在做的是使用默认时区输出与1970年1月1日午夜后一小时相对应的日期。

您似乎希望Date表示持续时间(即秒数)。它不会这样做,Date格式化程序也不会将日期作为持续时间。


  

我需要两个Date字段之间的时差,然后将它放在MySql(时间格式)

对于您要执行的操作,您需要将持续时间值计算为long,然后使用java.sql.Time(long)构造函数创建Time对象。您可以使用其toString()方法序列化此对象,也可以将其用作JDBC预处理语句中的参数。

事实证明,我上面的建议也是错误的。

您真正的问题是SQL时间类型用于表示时间...而不是持续时间。实际上,SQL没有专用的持续时间类型,因此您可以做的最好是将持续时间表示为整数秒或毫秒或其他。


(对于更一般的情况,通常认为Joda Time库提供了操作日期,时间和相关时间值的最佳API。但对于这个简单的情况,标准J2SE库应该足够......只要你正确使用它们。)

答案 1 :(得分:2)

问题是两种日期类型的差异不能用另一种日期类型表示。

答案 2 :(得分:1)

为什么不花两个日期的毫秒并将它们相互减去呢?

Calendar cal = Calendar.getInstance();
cal.setTime(d1);
long d1ms = cal.getTimeInMillis();
cal.setTime(d2);
long d2ms = cal.getTimeInMillis();

long diffMs = d1ms - d2ms;
long diffHour = diffMs * 1000 * 60 * 60;

答案 3 :(得分:0)

您可以尝试将此设置时区设为GMT。在结果时差中删除每天,每月的单词。自从1970年1月1日开始时间计数器以来,这个方法只做了几毫秒。所以如果你的结果说1970年1月3日意味着自计时器启动以来已过去3天,这是完美的。你只需要正确解释它,但格式化你的答案

...
long result = dateDiff(d1, d2); //This is your code in main([])
SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss SSS");
dateFormat.setTimeZone(TimeZone.getTimeZone("GMT"));
System.out.println(dateFormat.format(new Date(result )));