【问题标题】:what is the correct way of shifting the timezone elixir什么是改变时区长生不老药的正确方法
【发布时间】:2020-06-19 12:07:02
【问题描述】:

我正在尝试将 UTC DateTime 转换为某些时区。我想知道将时区从 UTC 转换为所需时区的正确方法是什么。

例如。

  1. 1 到 n 六月。 2020 年 UTC
  2. 1 到 n 六月。 2020 年在“澳大利亚/布里斯班”中

此时区比 UTC 多 10 小时。

我有一个日期列表。

现在,每天都有几个小时。当您将一天从 UTC 转换为 "Australia/Brisbane" 时。像这样

iex(6)> Calendar.DateTime.from_erl!({{2020, 6, 7}, {0, 0, 0}}, "Etc/UTC") |> Calendar.DateTime.shift_zone!("Australia/Brisbane")
#DateTime<2020-06-07 10:00:00+10:00 AEST Australia/Brisbane>
iex(7)> 

这基本上是正确的,这个方法应该做什么,但它有一些问题。

UTC 时区的一天,达到第 14 小时,例如

iex(7)> Calendar.DateTime.from_erl!({{2020, 6, 7}, {14, 0, 0}}, "Etc/UTC") |> Calendar.DateTime.shift_zone!("Australia/Brisbane")
#DateTime<2020-06-08 00:00:00+10:00 AEST Australia/Brisbane>
iex(8)> 

Australia/Brisbane 不再是 6 月 7 日,而是 6 月 8 日。

我正在尝试在其中填充日历。

第 14 天有 2 个小时,例如 22 和 23,在 UTC 中是 6 月 14 日,但是当它们转移到 Australia/Brisbane

当我想在月历中显示时,哪一天可用。有了这个

iex(6)> Calendar.DateTime.from_erl!({{2020, 6, 7}, {0, 0, 0}}, "Etc/UTC") |> Calendar.DateTime.shift_zone!("Australia/Brisbane")
#DateTime<2020-06-07 10:00:00+10:00 AEST Australia/Brisbane>
iex(7)> 

这是对的,但因为它只有 22 和 23 小时,不是在 6 月 14 日,而是在Australia/Brisbane 时区,它们将在第二天。

我的问题是,将 UTC 日期转换为另一个时区的权利是什么

如果是+ve,则转到第二天,如果是-ve,则转到前一天。

我们如何将 UTC 日期转换为另一个时区,它也包括白班,或者有更好的处理方法吗?

【问题讨论】:

    标签: datetime timezone elixir


    【解决方案1】:

    Timex 对这些类型的东西很有帮助。

    在这里您可以看到一个使用Timex.shift/2 函数的简单示例。如果您知道您正在使用的 UTC 偏移量,这将是一种有效的方法:

    iex> datetime_utc = DateTime.utc_now()
    ~U[2020-06-18 14:01:32.094925Z]
    iex> Timex.shift(datetime_utc, hours: +10)
    ~U[2020-06-19 00:01:32.094925Z]
    

    如果您只知道时区(不一定知道当前偏移量),那么您可以使用Timex.Timezone.convert/2 函数。当您必须处理偏移偏移时,这将很有帮助(因为每小时偏移会根据日期而变化,例如夏令时)。

    iex> datetime_utc = DateTime.utc_now()
    ~U[2020-06-18 14:01:32.094925Z]
    iex> Timex.is_valid_timezone?("Australia/Brisbane")
    true
    iex> timezone = Timex.Timezone.get("Australia/Brisbane", Timex.now())
    #<TimezoneInfo(Australia/Brisbane - AEST (+10:00:00))>
    iex> Timex.Timezone.convert(datetime_utc, timezone)
    #DateTime<2020-06-19 00:01:32.094925+10:00 AEST Australia/Brisbane>
    

    在上面的示例中,偏移量 (+10) 受Timex.now() 的影响。如果您在不同的时间输入该函数,您可以看到偏移量会发生变化,例如当我们查看 1 月的日期与 7 月的日期时,观察夏令时如何影响时区偏移:

    iex> timezone = Timex.Timezone.get("America/Denver", ~U[2020-01-01 12:00:00.0Z])
    #<TimezoneInfo(America/Denver - MST (-07:00:00))>
    iex> timezone = Timex.Timezone.get("America/Denver", ~U[2020-07-01 12:00:00.0Z])
    #<TimezoneInfo(America/Denver - MDT (-06:00:00))>
    

    希望有帮助!

    【讨论】:

      【解决方案2】:

      使用Timex

      例如

       "US/Pacific"
       |> Timex.now()
       |> Timex.to_datetime()
      

      【讨论】:

        猜你喜欢
        • 2016-02-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-03
        • 2019-08-30
        • 1970-01-01
        • 1970-01-01
        • 2010-09-16
        • 1970-01-01
        相关资源
        最近更新 更多