以秒为单位的时差给了我错误的答案

时间:2014-05-19 14:41:49

标签: java parsing date date-format

我有两个日期字符串,我想知道它们之间有多少秒差异。

2014-05-19 16:37:36:690  // formattedDate
2014-05-19 19:38:00:000  // expString

我使用以下代码:

SimpleDateFormat sdf = new SimpleDateFormat("yyy-MM-dd HH:mm:ss:SSS");
Date d1 = null;
Date d2 = null;

d1 = sdf.parse(expString);
d2 = sdf.parse(formattedDate);


long diff = d1.getTime() - d2.getTime();
long exp = diff / 1000 % 60;

在此特定示例中,exp23。这里有什么问题?

3 个答案:

答案 0 :(得分:2)

.getTime()返回自1970年1月1日00:00:00 GMT以来的时间(以毫秒为单位)。因此diff在两个日期之间的时间以毫秒为单位。

long diff = d1.getTime() - d2.getTime();
// diff = 10882310

您使用整数除法来获得秒数,这会减少额外的毫秒数。

long temp = diff / 1000;
// temp = 10823

然后你将模数减去60,这会得到几秒钟并忽略归因于分钟的秒数。

long exp = temp % 60;
// exp = 23

如果您想要两个日期之间的总时间(以秒为单位),则不希望执行上一次操作。

答案 1 :(得分:1)

不要使用模数除法!只需使用普通部门:

long diff = d1.getTime() - d2.getTime();
long exp = diff / 1000;

更好的是,使用JDK中的TimeUnit枚举:

long exp = TimeUnit.MILLISECONDS.toSeconds(d1.getTime() - d2.getTime());

答案 2 :(得分:1)

Joda-Time为您提供Seconds课程。

Joda-Time库还有代表时间跨度的类:DurationIntervalPeriod。对于这个具体问题,您并不严格需要它们,但它们对于相关工作将非常方便。

下面是一些未经测试的代码。

为简单起见,请将字符串转换为严格的ISO 8601格式。将空格替换为T

String inputStart = "…".replace( " ", "T" );
// same for stop

创建日期时间对象。显式分配用于解析这些字符串的时区。那是UTC吗?

DateTime startDateTime = new DateTime( inputStart, DateTimeZone.UTC );
// repeat for stop

long secs = Seconds.secondsBetween( startDateTime, stopDateTime ).getSeconds();