我有两个日期字符串,我想知道它们之间有多少秒差异。
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
。这里有什么问题?
答案 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库还有代表时间跨度的类:Duration,Interval和Period。对于这个具体问题,您并不严格需要它们,但它们对于相关工作将非常方便。
下面是一些未经测试的代码。
为简单起见,请将字符串转换为严格的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();