Apache spark 为什么unix_时间戳会在12小时后错误地解析这个?

Apache spark 为什么unix_时间戳会在12小时后错误地解析这个?,apache-spark,apache-spark-sql,unix-timestamp,Apache Spark,Apache Spark Sql,Unix Timestamp,以下内容似乎不正确(spark.sql): 选择unix\u时间戳(“2017-07-03T12:03:56”,“yyyy-MM-dd'T'hh:MM:ss”) -- 1499040236 与之相比: 选择unix\u时间戳(“2017-07-03T00:18:31”,“yyyy-MM-dd'T'hh:MM:ss”) -- 1499041111 显然,第一个在第二个之后。第二个似乎是正确的: #**R代码** #建立常数 一天=60*60*24 一年=365*一天 一年飞跃=366*1天 一

以下内容似乎不正确(
spark.sql
):

选择unix\u时间戳(“2017-07-03T12:03:56”,“yyyy-MM-dd'T'hh:MM:ss”)
-- 1499040236
与之相比:

选择unix\u时间戳(“2017-07-03T00:18:31”,“yyyy-MM-dd'T'hh:MM:ss”)
-- 1499041111
显然,第一个在第二个之后。第二个似乎是正确的:

#**R代码**
#建立常数
一天=60*60*24
一年=365*一天
一年飞跃=366*1天
一年四次=3*一年+一年跳跃
#至2014-01-01
11*1×4+
#至2017-01-01
2*一年+一年飞跃+
#至2017-07-01
(31+28+31+30+31+30)*一天+
#至2017-07-03 00:18:31
2*1天+18*60+31
# [1] 1499041111
类似的计算表明,第一个应为
1499083436
(由
as.integer(as.POSIXct('2017-07-03 12:03:56',tz='UTC')确认)
在R中,
1499040236
应对应于
2017-07-03 00:03:56

那么这里发生了什么?它看起来确实像一只虫子。最后两个健全性检查--
选择unix_时间戳(“2017-07-03T00:03:56”,“yyyy-MM-dd'hh:MM:ss”)
正确返回
1499040236
;用“空间<代码> >代码>在中间替换<代码> t>代码>对错误解析没有影响。



由于它在开发过程中似乎是固定的,我将注意到这是在
2.1.1

上,这只是一个格式错误:

  • 您的数据为0-23小时格式(在中表示为
    HH
  • 您使用与1-24小时格式相对应的
    hh
    格式
事实上,在最新的Spark版本(2.3.0 RC1)中,它根本不会解析:

spark.version
String=2.3.0
spark.sql(“”)
选择unix_时间戳(“2017-07-03T00:18:31”,“yyyy-MM-dd'T'hh:MM:ss”)“”)。显示
+----------------------------------------------------------+
|unix_时间戳(2017-07-03T00:18:31YYYY-MM-dd'T'hh:MM:ss)|
+----------------------------------------------------------+
|空的|
+----------------------------------------------------------+

更微妙的是——实际上不应该返回
null
是的,当然还有时间戳语义,这会导致不同节点上出现不同的时区:)哦,天哪,
2.1.1
行为非常有害--
选择unix\u时间戳(“2017-07-03T13:18:31”,“yyyy-MM-dd't'hh:MM:ss”)
以小时为单位返回
13
——只有
12
是模棱两可的,被丢弃了(我发现一些旧代码犯了同样的错误,我想知道我怎么会错过如此明显的东西)