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

Java 以秒为单位的时差给了我错误的答案,java,parsing,date,date-format,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 =

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

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;
在这个特定的例子中,
exp
23
。这里有什么问题

.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
如果您想要两个日期之间的总时间(以秒为单位),则不希望执行最后一个操作。

.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

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

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

long diff = d1.getTime() - d2.getTime();
long exp = diff / 1000;
更好的方法是使用JDK中的枚举:

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

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

long diff = d1.getTime() - d2.getTime();
long exp = diff / 1000;
更好的方法是使用JDK中的枚举:

long exp = TimeUnit.MILLISECONDS.toSeconds(d1.getTime() - d2.getTime());
提供一个你想要的课程

Joda时间库也有表示时间跨度的类:,和。对于这个特定的问题,您不需要严格地使用它们,但是它们对于相关的工作非常方便

下面是我脑海中一些未经测试的代码

为简单起见,请将字符串转换为严格的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();
提供一个你想要的课程

Joda时间库也有表示时间跨度的类:,和。对于这个特定的问题,您不需要严格地使用它们,但是它们对于相关的工作非常方便

下面是我脑海中一些未经测试的代码

为简单起见,请将字符串转换为严格的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();

任何%60
都会给出介于
0
59
之间的答案。您希望看到什么?更新后的结果是什么?因为这显然是你问题的原因你期待什么答案?如果你看一下你要减去的日期(mod 60),你会得到
60-36.69=23.31
,当你把它转换成长的时候,它会四舍五入到
23
。如果你不mod 60,你会得到
10823
秒,也就是3小时23秒,这是这些日期之间的实际差异。
anything%60
将始终给出
0
59
之间的答案。您希望看到什么?更新后的结果是什么?因为这显然是你问题的原因你期待什么答案?如果你看一下你要减去的日期(mod 60),你会得到
60-36.69=23.31
,当你把它转换成长的时候,它会四舍五入到
23
。如果你不mod 60,你会得到
10823
秒,也就是3小时23秒,这是两个日期之间的实际差异。但是3小时不是83秒?但是3小时不是83秒?