首页 > 解决方案 > date_format 不处理带有“00:00:00”的时间戳

问题描述

2020-01-27 00:00:00它的类型格式timestamp2020-01-27 12:00:00而不是2020-01-27 00:00:00

  import spark.sqlContext.implicits._
  import java.sql.Timestamp
import org.apache.spark.sql.functions.typedLit


scala>   val stamp = typedLit(new Timestamp(1580105949000L))
stamp: org.apache.spark.sql.Column = TIMESTAMP('2020-01-27 00:19:09.0')


scala>   var df_test = Seq(5).toDF("seq").select(
     |     stamp.as("unixtime"),
     |     date_trunc("HOUR", stamp).as("date_trunc"),
     |     date_format(date_trunc("HOUR", stamp), "yyyy-MM-dd hh:mm:ss").as("hour")
     |   )
df_test: org.apache.spark.sql.DataFrame = [unixtime: timestamp, date_trunc: timestamp ... 1 more field]


scala> df_test.show
+-------------------+-------------------+-------------------+
|           unixtime|         date_trunc|               hour|
+-------------------+-------------------+-------------------+
|2020-01-27 00:19:09|2020-01-27 00:00:00|2020-01-27 12:00:00|
+-------------------+-------------------+-------------------+

标签: scalaapache-sparkdatetimeunix-timestamp

解决方案


你的模式应该是yyyy-MM-dd HH:mm:ss.

date_format,根据其文档,使用以下支持的说明符java.text.SimpleDateFormat

将日期/时间戳/字符串转换为字符串值,其格式由第二个参数给出的日期格式指定。
有关有效的日期和时间格式模式,请参阅 SimpleDateFormat。

SimpleDateFormat的文档可以在这里找到

hh用于“上午/下午 (1-12) 小时”。您正在寻找日期说明符中的小时,即HH.


推荐阅读