将日光节约时间字符串转换为时间戳会产生错误的结果

Posted

技术标签:

【中文标题】将日光节约时间字符串转换为时间戳会产生错误的结果【英文标题】:Converting day lights savings time string to timestamp gives wrong results 【发布时间】:2018-06-20 02:52:51 【问题描述】:

我有一个pyspark 数据框。在这个数据框中,我有一个名为test_time 的列,它的数据类型为string

>>> df
DataFrame[test_time: string]

df.show()

+-------------------+
|          test_time|
+-------------------+
|2017-03-12 02:41:06|
|2017-03-12 02:43:52|
|2017-03-12 02:56:32|
|2017-03-12 03:16:23|
|2017-03-12 03:17:15|
|2017-03-12 03:22:19|
|2017-03-12 03:52:19|
|2017-03-12 04:03:21|
+-------------------+

现在我想将此test_time 列从string 转换为timestamp

我已经完成了如下操作

from pyspark.sql import functions as F
df1 = df.withColumn('convert_test', F.unix_timestamp('test_time', "yyyy-MM-dd hh:mm:ss").cast('timestamp'))

>>> df1
DataFrame[test_time: string, convert_test: timestamp]

df1.show()

+-------------------+--------------------+
|          test_time|        convert_test|
+-------------------+--------------------+
|2017-03-12 02:41:06|2017-03-12 03:41:...|
|2017-03-12 02:43:52|2017-03-12 03:43:...|
|2017-03-12 02:56:32|2017-03-12 03:56:...|
|2017-03-12 03:16:23|2017-03-12 03:16:...|
|2017-03-12 03:17:15|2017-03-12 03:17:...|
|2017-03-12 03:22:19|2017-03-12 03:22:...|
|2017-03-12 03:52:19|2017-03-12 03:52:...|
|2017-03-12 04:03:21|2017-03-12 04:03:...|
+-------------------+--------------------+

如您所见,Hours 与行 1-3 不同。

FYI 我的时区是PST1-3 行是day light savings 时间期间的计时。

我怎样才能进行正确的转换。

【问题讨论】:

您的数据看起来有问题。如果 timeone 是 PST,那么应该有更正,然后在 02:00:00 时钟应该向前移动到 03:00:00 并且你永远不应该得到02:41:06。在这种情况下,转换本地 TZ -> UTC -> 本地 TZ 听起来像是未定义的东西,但我绝对不希望看到 2017-03-12 02:41:06。虽然我不是时区专家...... :) @user6910411 数据来自mysql 表,我将timestamp 列为string。数据正确 我的意思是 - 您在不考虑夏令时的情况下导出数据,但在配置为更正夏令时的系统中读取数据。如果您的时钟设置为America/Los_Angeles(似乎等同于您当前的设置),您首先不会体验02:41。但就像说的那样,我可能错了。 【参考方案1】:

我通过unix_timestamp()得到正确的输出

  val dataframe = Seq(
    ("2017-03-12 02:41:06"),
    ("2017-03-12 02:43:52"),
    ("2017-03-12 02:56:32"),
    ("2017-03-12 03:16:23"),
    ("2017-03-12 03:17:15"),
    ("2017-03-12 03:22:19"),
    ("2017-03-12 03:52:19"),
    ("2017-03-12 04:03:21")
  ).toDF("test_time")

 dataframe.withColumn("convert_test", unix_timestamp($"test_time", "yyyy-MM-dd hh:mm:ss").cast("timestamp")).show()

输出:

+-------------------+--------------------+
|          test_time|        convert_test|
+-------------------+--------------------+
|2017-03-12 02:41:06|2017-03-12 02:41:...|
|2017-03-12 02:43:52|2017-03-12 02:43:...|
|2017-03-12 02:56:32|2017-03-12 02:56:...|
|2017-03-12 03:16:23|2017-03-12 03:16:...|
|2017-03-12 03:17:15|2017-03-12 03:17:...|
|2017-03-12 03:22:19|2017-03-12 03:22:...|
|2017-03-12 03:52:19|2017-03-12 03:52:...|
|2017-03-12 04:03:21|2017-03-12 04:03:...|
+-------------------+--------------------+

如果您在不同的时区,则可以使用 from_utc_timestamp()to_utc_timestamp() 之类的函数来转换时间戳

希望这对您有所帮助!

【讨论】:

那么您是否尝试从 utc 转换为 PST

以上是关于将日光节约时间字符串转换为时间戳会产生错误的结果的主要内容,如果未能解决你的问题,请参考以下文章

使用云功能时,来自 Firestore 的时间戳会转换为地图

php怎么将指定日期转换为时间戳

Big Query 无法将字符串转换为时间戳

将纪元时间(以毫秒为单位)转换为时间戳到 UTC 错误

如何将日期和时间转换为时间戳

将日期和时间转换为时间戳 [重复]