Spark:将 GMT 时间戳转换为东部时间,考虑夏令时

问题描述 投票:0回答:2

我正在尝试将一列 GMT 时间戳字符串转换为一列东部时区时间戳。我想考虑夏令时。

我的时间戳字符串列如下所示:

'2017-02-01T10:15:21+00:00'

我想出了如何将字符串列转换为 EST 中的时间戳:

from pyspark.sql import functions as F

df2 = df1.withColumn('datetimeGMT', df1.myTimeColumnInGMT.cast('timestamp'))
df3 = df2.withColumn('datetimeEST', F.from_utc_timestamp(df2.datetimeGMT, "EST"))

但是时间不会随着夏令时而改变。是否有其他函数或其他函数可以通过转换时间戳来考虑夏令时?

编辑:我想我明白了。在上面的 from_utc_timestamp 调用中,我需要使用“America/New_York”而不是“EST”:

df3 = df2.withColumn('datetimeET', F.from_utc_timestamp(df2.datetimeGMT, "America/New_York"))
apache-spark timezone timestamp pyspark dst
2个回答
17
投票

我最终找到了答案,所以我想我会在这里添加它。我还认为这个问题/答案是值得的,因为当我在发布问题之前搜索这个问题时,我找不到关于 Spark 夏令时的任何信息。我可能应该意识到我应该搜索底层的 java 函数。

问题的答案最终是使用字符串“America/New_York”而不是“EST”。这正确地应用了夏令时。

from pyspark.sql import functions as F
df3 = df2.withColumn('datetimeET', F.from_utc_timestamp(df2.datetimeGMT, "America/New_York"))

编辑:

此链接显示了可以以此方式使用的可用时区字符串的列表:https://garygregory.wordpress.com/2013/06/18/what-are-the-java-timezone-ids/


0
投票

我建议使用 unix_timestamp 将 utc_datetime_column 转换为时间戳类型,然后使用 from_utc_timestamp()。

from_utc_timestamp( unix_timestamp(datetime_column).cast(TimestanpType()),'美国/芝加哥')

这将解决夏令时问题。 to_timestamp() 代替 unix_timestamp() 不会处理夏令时。

© www.soinside.com 2019 - 2024. All rights reserved.