长整数和nscala_time

时间:2015-03-20 14:40:13

标签: scala datetime type-conversion long-integer

我的顶级问题是在Scala中使用nscala_time(它需要几毫秒---应该很容易),从流中获取一些时间值为64位纳秒Unix时间。遇到了一些问题,我开始尝试,发现它很容易将Long转换为Int,我无法理解规则。有了一个我可以传递给nscala_time的号码,然后我发现我选择的号码没有转换为有效的日期时间字符串。

我的代码如下:

  val constructedTimeOne:Long = (((((((3) * 24) + 12) * 60) + 34) * 60 + 56) * 1000)
  val constructedDateOne = new DateTime(constructedTimeOne)
  val constructedStringOne = constructedDateOne.toString("YYYY-MM-DD HH:MM:SS")
  println(s"constructedTime $constructedTimeOne converts to $constructedStringOne")

  val constructedTimeTwo:Long = constructedTimeOne + (31 * 24 * 60 * 60 * 1000).asInstanceOf[Long]
  val constructedDateTwo = new DateTime(constructedTimeTwo)
  val constructedStringTwo = constructedDateTwo.toString("YYYY-MM-DD HH:MM:SS")
  println(s"constructedTime $constructedTimeTwo converts to $constructedStringTwo")

  val constructedTimeThree:Long = (constructedTimeOne + (31.asInstanceOf[Long] * 24 * 60 * 60 * 1000 ))
  val constructedDateThree = new DateTime(constructedTimeThree)
  val constructedStringThree = constructedDateThree.toString("YYYY-MM-DD HH:MM:SS")
  println(s"constructedTime $constructedTimeThree converts to $constructedStringThree")

当我运行它时,我得到了这个输出:

constructedTime 304496000 converts to 1970-01-04 13:01:00
constructedTime -1312071296 converts to 1969-12-350 20:12:70
constructedTime 2982896000 converts to 1970-02-35 13:02:00

有人可以解释保持值Long的规则吗?我可以将“asInstanceOf”移动到第三部分中的任何乘法项,并且它可以正常工作,但是将它放在该带括号的表达式的外部(如第二部分所示)不起作用。

而且,当然,将任意数量(在这种情况下为时间间隔,毫秒)转换为日期和时间的结果应该产生一个有效的日期和时间,那么我做错了什么产生了1970-02的日期-35

1 个答案:

答案 0 :(得分:0)

您的代码可能存在两个主要问题。

1970-02-35的原因是您错误地格式化了日期。该月的某一天使用d代替大写的D,这是一年中的#34;"。文档为here

因此,如果您只是将其更改为:

constructedDateThree.toString("YYYY-MM-dd HH:MM:SS")

它将按预期工作:

scala> val constructedStringThree = constructedDateThree.toString("YYYY-MM-dd HH:MM:SS")
constructedStringThree: String = 1970-02-04 09:02:00

现在,要使用Long值,您应该使用toLong而不是仅使用asInstanceOf投射该类。使用文字时,请使用格式5L5l来表示Long个数字。