我遇到了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()
方法。
这是问题出现的地方。再次感谢,希望这有所帮助。
答案 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);
解决了这个问题。我为浪费每个人的时间而道歉,因为这对我来说只是一个逻辑错误。
我真诚地感谢所提供的所有帮助。