从时间戳中提取一年时,始终获得“1970”

时间:2017-07-28 12:38:54

标签: scala apache-spark

我有一个像“1461819600”这样的时间戳。我在val campaign_startdate_year: String = Utils.getYear(campaign_startdate_timestamp).toString

的分布式环境中执行此代码

问题是我总是在同一年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
  }

3 个答案:

答案 0 :(得分:3)

您拥有的时间戳是自01-01-1970,00:00:00 UTC以来的数量。

Java(和Scala)通常使用自01-01-1970,00:00:00 UTC以来毫秒的时间戳。

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

答案 1 :(得分:1)

你可以依赖spark sql函数,它有一些date utilities(获得年/月/日,添加日/月),或者你可以使用JodaTime库来控制Date和DateTime,比如我在这里回答:How to replace in values in spark dataframes after recalculations?

答案 2 :(得分:1)

自纪元以来,您所拥有的时间戳似乎在中(即Unix时间戳)。 Java时间实用程序期望时间戳为毫秒

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