2017-07-28 47 views
1

我有一个像“1461819600”这样的时间戳。我在分布式环境中执行此代码为val campaign_startdate_year: String = Utils.getYear(campaign_startdate_timestamp).toString从时间戳中提取一年时总是得到“1970”

问题是我总是得到同一年1970。这可能是它的原因?

import com.github.nscala_time.time.Imports._ 

def getYear(timestamp: Any): Int = { 
    var dt = 2017 
    if (!timestamp.toString.isEmpty) 
    { 
     dt = new DateTime(timestamp.toString.toLong).getYear // toLong should be multiplied by 1000 to get millisecond value 
    } 
    dt 
    } 

当我想要得到一个月的某一天时会发生同样的问题。我得到17而不是28

def getDay(timestamp: Any): Int = { 
    var dt = 1 
    if (!timestamp.toString.isEmpty) 
    { 
     dt = new DateTime(timestamp.toString.toLong).getDayOfYear 
    } 
    dt 
    } 
+0

'1970'是时间戳“0”的yrear。你确定你的'toLong'转换没有返回'0'值吗? –

+0

@ ADreNaLiNe-DJ:如果字符串不为空,为什么它会返回'0'?如果它是空的,那么我会因'if(!timestamp.toString.isEmpty)'而获得'2017'。 – Dinosaurius

+0

'string'可能是''''''''''''''''''。 'timestamp'的'type'是'Any',所以它可以是数字以外的任何东西,所以'toLong'可能会因返回'0'值而失败。 –

回答

3

您拥有的时间戳记为自01-01-1970,00:00:00 UTC。

Java(和Scala)通常使用的时间戳记是从01-01-1970,00:00:00 UTC开始的毫秒数

换句话说,您需要将数字乘以1000.

+0

我会使用java.util.concurrent.TimeUnit.SECONDS.toMllis(s)而不是乘以'幻数' –

1

时间戳,你似乎在自纪元(即Unix时间戳)。 Java时间实用程序预计时间戳记为毫秒

只需将该值乘以1000即可获得预期结果。