2015-03-20 4 views
1

Моя проблема верхнего уровня заключается в том, чтобы взять некоторые значения времени, которые я получаю из потока, как 64-разрядные наносекундные Unix-времена, в Scala, используя nscala_time (которому требуется миллисекунды --- должно быть достаточно просто) , Ударя некоторые проблемы с этим, я начал экспериментировать и обнаружил, что он легко конвертирует Long в Int, и я не могу понять правила для этого. Получив число, которое я могу передать nscala_time, я обнаружил, что номер, который я выбрал, не конвертируется в действительную строку даты.длинные целые числа и 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

Возможны две основные проблемы с вашим кодом.

Причина 1970-02-35 в том, что вы неверно форматируете дату. День месяца использует d вместо капитализированного D, что для «дня года». Документы: 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.

+0

Благодаря использованию 1000000L в качестве коэффициента преобразования от наносекунд до миллисекунд оказалось достаточно, чтобы исправить исходную проблему. – HillWithSmallFields

Смежные вопросы