有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java中的毫秒。util。日期解释得不好

我有两个java日期,格式为yyyy-MM-dd HH:MM:ss。SSS。我需要做一个简单的算术运算。我的代码是:

SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); 
String out = resu.getString(3);
Date dateOut = formatter.parse(out);
String in = resu.getString(4);
Date dateIn = formatter.parse(in);
long msDiff = dateOut.getTime() - dateIn.getTime();

如果两个日期都有3毫秒,则此操作正常,例如:

dateIn = 2015-10-14 16:32:20.037
dateOut = 2015-10-14 16:32:20.093

但是当一个日期有一个或两个数字,而不是在右边用零来完成值时,它会在左边完成,这当然会改变操作的结果。例如

dateIn = 2015-10-14 16:32:20.05
dateOut = 2015-10-14 16:32:20.067

dateOut - dateIn = 062 //this is wrong, it should be 067 - 050 = 17.

我做错了什么

我没有找到一个好的解决方案,所以我做了一个很好的解决方案。它检查毫秒数并始终返回三位

public static String completeDate (String date) {
    String digits = date.substring(date.indexOf("."));
    int cantDigits = digits.length();
    while (cantDigits < 4){
        digits = digits + "0";
        cantDigits = digits.length();
    }
    String newDate = date.substring(0,date.indexOf(".")) + digits;
    return newDate;
}

共 (2) 个答案

  1. # 1 楼答案

    由于小数点后的位数不同,这两个日期在技术上有不同的模式。从documentation of ^{}开始:

    Pattern letters are usually repeated, as their number determines the exact presentation:

    ...

    For formatting, the number of pattern letters is the minimum number of digits, and shorter numbers are zero-padded to this amount. For parsing, the number of pattern letters is ignored unless it's needed to separate two adjacent fields.

    鉴于此,日期2015-10-14 16:32:20.05被解释为2015-10-14 16:32:20.005(分数用零填充以有三位数字),因此差值为62毫秒。您应该为这两个日期使用不同的格式化程序,或者很可能应该查看这两个值是如何插入的,以及它们具有不同格式的原因

  2. # 2 楼答案

    如果通过SimpleDateFormat将它们转换为java.util.Datejava.sql.Date,则timestamp1.getTime() - timestamp2.getTime()将产生正确的千秒数

    这个测试确实表明断言失败了。您可以通过在末尾添加额外的零来修复它

    @Test
    public void validateDateComparison() {
        DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
        try {
            Date dateStart = dateFormat.parse("2015-10-14 16:32:20.05");
            Date dateEnd = dateFormat.parse("2015-10-14 16:32:20.067");
    
            assertEquals(17, dateEnd.getTime() - dateStart.getTime());
        } catch (ParseException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    

    {a1}的样本:

    DateTime start = new DateTime(2004, 12, 25, 0, 0, 0, 0);
    DateTime end = new DateTime(2005, 1, 1, 0, 0, 0, 0);
    
    // duration in ms between two instants
    Duration dur = new Duration(start, end);
    
    // calc will be the same as end
    DateTime calc = start.plus(dur);
    

    我不确定JodaTime处理这个duration是否正确