为什么减去两个日期会给我额外的一小时?

时间:2015-11-20 13:27:56

标签: scala

我想对我的程序的某些方法执行一些基准测试,所以我写了这个小片段

object ExecutionTime {

  private val format = new java.text.SimpleDateFormat("hh:mm:ss")

  private var timeList = scala.collection.mutable.MutableList[String]()

  def startTimer() : Long = {
    val start = System.currentTimeMillis()
    start
  }

  def getExecutionTime(start : Long) {
    val executionTime = System.currentTimeMillis() - start
    timeList.+=(format.format(new Date(executionTime)))
  }

  def printResults() {
    timeList.mkString(" /n ")
  }
}

为了测试这个,我运行了这段代码:

object Test {
  val begin = ExecutionTime.startTimer()
  waitFor2Seconds()
  ExecutionTime.getExecutionTime(begin)
  ExecutionTime.printResults()
}

然而,当我运行这个时,我得到一个奇怪的输出:

01:00:02 // Should be 00:00:02

我得到的结果是我期望的结果,但是额外加1小时。 有人对此有所了解吗?

2 个答案:

答案 0 :(得分:4)

您正在使用时钟测量之间的时间差来构造Date对象。因此,SimpleDateFormat在构造String时将Date转换为本地时间。

来自documentation(强调我的):

  

SimpleDateFormat是用于格式化和解析日期的具体类   以区域设置敏感的方式

您构建的日期是纪元+ 2秒,因此您的当地时间必须是(纪元+ 1小时+2秒);这就是格式化程序正在打印的内容。

要在没有添加1小时的情况下进行SimpleDateFormat打印,您需要将区域设置设置为GMT并将小时格式更改为"HH"

private val format = new java.text.SimpleDateFormat("HH:mm:ss")
format.setTimeZone(java.util.TimeZone.getTimeZone("GMT"))

答案 1 :(得分:2)

作为另一个建议,请查看Joda时间库(here's a scala wrapper)。该库可用于轻松减去和添加时间段并即时转换为时间格式。我更喜欢它的SimpleDateFormat类。