我的顶级问题是在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
答案 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
投射该类。使用文字时,请使用格式5L
或5l
来表示Long
个数字。