我想对我的程序的某些方法执行一些基准测试,所以我写了这个小片段
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小时。 有人对此有所了解吗?
答案 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类。