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

Posted

技术标签:

【中文标题】Spark:考虑夏令时将 GMT 时间戳转换为东部时间【英文标题】:Spark: converting GMT time stamps to Eastern taking daylight savings into account 【发布时间】:2018-01-27 13:11:42 【问题描述】:

我正在尝试将一列 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"))

【问题讨论】:

是的,你是对的。您应该始终使用时区标识符的区域/地点形式。如果你愿意的话,你可以用这个来回答你自己的问题,尽管这个特定的点之前已经讨论过很多次了(尽管可能与 spark 无关)。 【参考方案1】:

我最终找到了答案,所以我想我会在这里添加它。我也认为这个问题/答案是值得的,因为当我在发布问题之前搜索这个问题时,我找不到任何关于 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/

【讨论】:

我试过这个英国格式。但不工作。 df3 = df_temp2.withColumn('datetimeET', F.from_utc_timestamp("SRC_ACTVTY_DATE", 'Europe/London'))

以上是关于Spark:考虑夏令时将 GMT 时间戳转换为东部时间的主要内容,如果未能解决你的问题,请参考以下文章

JODA 夏令时转换

从 R 中的 GMT 转换时考虑夏令时

SQL Server 2008 函数将 GMT 时间转换为 AEST 并采用夏令时

转换东部时区的时间并以没有 GMT-4 的正式时间格式打印

Angular:将时间戳转换为特定时区,尊重夏令时

如何在 Pyspark 中将秒数从 Epoch 时间转换为 UTC 时间?