在Scala中如何将Long类型转换为Int类型?

46

我想使用以下函数将Joda Time转换为Unix时间戳:


def toUnixTimeStamp(dt : DateTime) : Int = {
  val millis = dt.getMillis
  val seconds = if(millis % 1000 == 0) millis / 1000
    else { throw new IllegalArgumentException ("Too precise timestamp") }

  if (seconds > 2147483647) {
    throw new IllegalArgumentException ("Timestamp out of range")
  }

  seconds
}

我想获取的时间值不需要精确到毫秒,它们是通过协议以秒为单位的UTC,并且要进一步以Int形式存储(在MySQL DB中),标准Unix时间戳是我们公司时间记录的标准。但Joda Time仅提供getMillis而不是getSeconds,因此我必须获取一个Long型的毫秒级时间戳,然后将其除以1000以生成标准Unix时间戳。

而我卡在了让Scala将Long值转换为Int上。如何进行这样的转换?


相关:https://dev59.com/NXNA5IYBdhLWcg3wgeOk - Eugene Yokota
1个回答

84

使用Long类型的 .toInt 方法, 例如:seconds.toInt


1
.toIntasInstanceOf[Int] 更好。我当时在想什么呢。 - Eugene Yokota
看起来它可以工作。至少编译通过了。也许我需要睡一会儿... :-] - Ivan
@eugene-yokota,您能否解释一下为什么.toInt比asInstanceOf[Int]更好?直觉上看似乎很明显,但我很好奇想知道更多。 - Ivan
4
@Ivan,因为toInt仍在Scala标准库的范围内(并且希望具有良好的优化和检查等),而asInstanceOf就像在飞机在半空中时打开紧急逃生口一样。 - Eugene Yokota
11
@Ivan 强制类型转换在本质上是不安全的。例如,class Foo; (new Foo).asInstanceOf[Int] 可以编译通过,但会在运行时抛出 ClassCastException 异常。因此使用强制类型转换,你失去了在编译时进行静态类型检查的好处。 - Luigi Plinge
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接