Scala 总是得到;1970年“;从时间戳中提取年份时

Scala 总是得到;1970年“;从时间戳中提取年份时,scala,apache-spark,Scala,Apache Spark,我有一个类似“1461819600”的时间戳。我在分布式环境中以val-campaign\u-startdate\u-year:String=Utils.getYear(campaign\u-startdate\u-timestamp.toString 问题是我总是得到同一年的1970。这可能是原因吗 import com.github.nscala_time.time.Imports._ def getYear(timestamp: Any): Int = { var dt = 20

我有一个类似“1461819600”的时间戳。我在分布式环境中以
val-campaign\u-startdate\u-year:String=Utils.getYear(campaign\u-startdate\u-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
  }

您可以依赖于spark sql函数(获取年/月/日,添加日/月),也可以使用JodaTime库对日期和日期时间进行更多控制,如我在这里的回答所示:

您可以依赖于spark sql函数(获取年/月/日,添加日/月)或者,您可以使用JodaTime库对日期和日期时间进行更多的控制,如我在这里的回答所示:

您拥有的时间戳似乎是从纪元开始的秒数(即Unix时间戳)。Java时间实用程序期望时间戳以毫秒为单位


只需将该值乘以
1000
,就可以得到预期的结果。

您拥有的时间戳似乎是从纪元开始的秒数(即Unix时间戳)。Java时间实用程序期望时间戳以毫秒为单位


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

您拥有的时间戳是自1970年1月1日00:00:00 UTC以来的秒数

Java(和Scala)通常使用自1970年1月1日00:00:00 UTC以来的时间戳,时间戳为毫秒


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

您拥有的时间戳是自1970年1月1日00:00:00 UTC以来的秒数

Java(和Scala)通常使用自1970年1月1日00:00:00 UTC以来的时间戳,时间戳为毫秒


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

1970
是时间戳
0
的Y轴。你确定你的
toLong
转换没有返回
0
值吗?@ADreNaLiNe DJ:如果字符串不是空的,为什么它会返回
0
?如果它是空的,那么我将得到
2017
,因为
If(!timestamp.toString.isEmpty)
字符串可能是
字符串,类似于
abc
时间戳
类型
任何
,因此它可以是数字以外的任何东西,因此
toLong
可能会返回一个
0
值而失败。@ADreNaLiNe DJ:我很确定这些都是数字。但问题可能与分布式环境有关…
new java.util.Date(1461819600L)
returns
Sat Jan 17 16:03:39 CST 1970
。乘以1000。
1970
是时间戳
0
的Y轴。你确定你的
toLong
转换没有返回
0
值吗?@ADreNaLiNe DJ:如果字符串不是空的,为什么它会返回
0
?如果它是空的,那么我将得到
2017
,因为
If(!timestamp.toString.isEmpty)
字符串可能是
字符串,类似于
abc
时间戳
类型
任何
,因此它可以是数字以外的任何东西,因此
toLong
可能会返回一个
0
值而失败。@ADreNaLiNe DJ:我很确定这些都是数字。但问题可能与分布式环境有关…
new java.util.Date(1461819600L)
returns
Sat Jan 17 16:03:39 CST 1970
。同样,
java.time.{Instance,LocalDateTime,LocalDate}
java.time.{Instance,LocalDateTime,LocalDate}
而不是仅仅乘以一个“神奇的数字”