Scala 为什么减去两个日期会给我额外的一个小时?
我想在我的程序的一些方法上执行一些基准测试,所以我写了这个小片段Scala 为什么减去两个日期会给我额外的一个小时?,scala,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.
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个小时。
有人对此有想法吗 您正在使用时钟测量之间的时间差构建一个
日期
对象。因此,在构造字符串时,SimpleDateFormat
将日期转换为本地时间
从(我的)重点:
SimpleDataFormat是一个用于格式化和解析日期的具体类
以对地区敏感的方式
您的构造日期为历元+2秒,因此您的本地时间必须为(历元+1小时+2秒);这就是格式化程序正在打印的内容
要在不增加1小时的情况下进行SimpleDataFormat打印,您需要将区域设置为GMT,并将小时格式更改为“HH”
:
您正在使用时钟测量之间的时间差来构造一个
日期
对象。因此,在构造字符串时,SimpleDateFormat
将日期转换为本地时间
从(我的)重点:
SimpleDataFormat是一个用于格式化和解析日期的具体类
以对地区敏感的方式
您的构造日期为历元+2秒,因此您的本地时间必须为(历元+1小时+2秒);这就是格式化程序正在打印的内容
要在不增加1小时的情况下进行SimpleDataFormat打印,您需要将区域设置为GMT,并将小时格式更改为“HH”
:
另一个建议是,查看Joda时间库()。此库可用于轻松地减去和添加时间段,并动态转换为时间格式。与SimpleDataFormat类相比,我更喜欢它。另一个建议是,查看Joda时间库()。此库可用于轻松地减去和添加时间段,并动态转换为时间格式。与SimpleDateFormat类相比,我更喜欢它。碰巧,您所在的位置的时区是格林威治标准时间后1小时吗?我这样问是因为您正在使用测量的时间增量构建日期,日期格式化程序可能正在转换为“本地时间”…事实上,我是GMT+1!在GMT+1中设置格式有什么诀窍吗?
Date
对象实际上并不是用来存储持续时间的。Date
格式是时间戳,而不是持续时间。如果在Java8JVM上运行,请使用Java8Java.time
API,而不是旧的Java.util.Date
。您可以使用java.time.Duration
来实现这一点。您所在的位置的时区是格林威治标准时间后1小时吗?我这样问是因为您正在使用测量的时间增量构建日期,日期格式化程序可能正在转换为“本地时间”…事实上,我是GMT+1!在GMT+1中设置格式有什么诀窍吗?Date
对象实际上并不是用来存储持续时间的。Date
格式是时间戳,而不是持续时间。如果在Java8JVM上运行,请使用Java8Java.time
API,而不是旧的Java.util.Date
。你应该使用java.time.Duration
来实现这一点。这可能是正确的方法,不幸的是“GMT”时区给我12:00:02,不太清楚,GMT+1:00给我的结果与之前相同。将格式更改为“HH:mm:ss”(注意大写字母“H”)。谢谢!下次我会记得用大写字母“H”!这可能是正确的方法,不幸的是“GMT”时区给我12:00:02,不太清楚,GMT+1:00给我的结果与之前相同。将格式更改为“HH:mm:ss”(注意大写字母“H”)。谢谢!下次我会记得用大写字母“H”!
private val format = new java.text.SimpleDateFormat("HH:mm:ss")
format.setTimeZone(java.util.TimeZone.getTimeZone("GMT"))