yyyy的Java SimpleDateFormat格式问题

时间:2014-09-10 23:38:05

标签: java simpledateformat

我遇到了SimpleDateFormat对象的format方法。

有问题的代码是:

new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault()).format(date);

其中“date”是使用Calendar.getTimeInMillis()中的long int创建的Date对象;

Calendar cal = Calendar.getInstance();
Date date = new Date(cal.getTimeInMillis());

除了字符串的年份部分外,一切正常。当我传递日期时,输出的字符串如下所示:

0044-09-10 05:30:24 

传递的日期对象是从返回的长整数创建的:

Calendar.getTimeInMillis();

我相信从这个方法返回的数字是从1月1日开始的毫秒数。 1970年,我认为这是问题所在,但即使我在1970年加上毫秒数(大声笑,可能是错误的事情,但它值得一试:P),它仍然在0044中解析年份。

我已经完成了大量的谷歌搜索,所有似乎都指出了传递给SimpleDateFormat构造函数的字符串中的简单问题,所以我在这里不知所措。

非常感谢任何帮助。

如果需要任何其他信息,请告诉我,我会尽力提供。

再次感谢!

修改

我想我会更多地解释一下背景:

技术人员将进行呼叫,并且在到达站点时,将呼叫标记为“已启动”。 然后,应用程序将创建一个Calendar实例并保存从Calendar.getTimeInMillis()返回的long int。

当技术人员完成通话后,他/她会将通话标记为“完成”。同样,创建了一个Calendar实例,并保存了从Calendar.getTimeInMillis()返回的long int。

这样可以轻松“调用持续时间”计算。

现在,当使用技术人员在应用程序中使用的结束表单时,在调用期间保存的长整数将传递给Date对象,然后传递给SimpleDateFormat.format()方法。

这是问题出现的地方。再次感谢,希望这有所帮助。

3 个答案:

答案 0 :(得分:6)

要计算日期/时间之间的持续时间,不要依赖减去毫秒,这是非常不可靠的。

如果您使用的是Java 8,则应该利用新的java.time API,例如......

LocalDateTime dt1 = LocalDateTime.of(2014, 9, 11, 10, 0);
LocalDateTime dt2 = LocalDateTime.of(2014, 9, 11, 12, 0);

Duration duration = Duration.between(dt1, dt2);
System.out.println(duration.toDays());
System.out.println(duration.toHours());
System.out.println(duration.toMinutes());
System.out.println(duration.getSeconds());

哪些输出......

0
2
120
7200

请查看Period and Duration了解详情。

或者,您可以使用JodaTime(基于java.time

答案 1 :(得分:2)

Calendar.getTimeinMillis()返回的时间是自" epoch"以来的毫秒。时间。咨询Date课程的javadoc,你会发现" epoch"是January 1, 1970, 00:00:00 GMT。因此,你的代码应该没问题。我已经使用以下代码进行了测试:

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


public class Cal {

    public static void main(String[] args) {
        Calendar cal = Calendar.getInstance();
        Date date = new Date(cal.getTimeInMillis());

        new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault()).format(date);

        System.out.println(date);
    }

}

它提供了正确的输出:

Thu Sep 11 09:48:30 KST 2014

有人认为,我想提及的是“通话时间”'不是约会。如果您尝试将两个long值之间的减法结果转换为Date对象,它将失败,因为减法将从long值中消除该时间段的时间部分。减法的结果只有一毫秒。

答案 2 :(得分:1)

好的,我已经解决了这个问题。事实证明,我没有包含足够的信息让每个人都能正确地找出这个问题。

在应用程序中,我使用两个选择器,一个用于日期,一个用于时间,在保存日期时,它保存所选日期,时间设置为00:00:00并将其转换为长整数毫秒。

使用:

Calendar cal = Calendar.getInstance();
cal.set(year, month, day);

当保存时间时,它会使用相同的方法保存所选的时间,但是当我打电话cal.set()时,我将年,月和日设置为0.

cal.set(0, 0, 0, hour, minute, second);

将此声明更改为

cal.set(1970, 0, 1, hour, minute, second);

解决了这个问题。我为浪费每个人的时间而道歉,因为这对我来说只是一个逻辑错误。

我真诚地感谢所提供的所有帮助。