代码之家  ›  专栏  ›  技术社区  ›  Junaid Farooq

改变时区的正确方法是什么

  •  0
  • Junaid Farooq  · 技术社区  · 5 年前

    例如。

    此时区比UTC+10小时。

    DAYS

    "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

    我试图通过这个来填充一个日历。

    enter image description here

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

    当我想显示在月历,哪一天是可用的。用这个

    #日期时间<2020-06-07 10:00:00+10:00 AEST澳大利亚/布里斯班>
    iex(7)>
    

    这是正确的,但因为它只有22和23个小时,不是在6月14日,而是在时区 澳大利亚/布里斯班 他们第二天就到了。

    我的问题是,什么是正确的转换UTC的一天到另一个时区,它将在某一点上切换全天,因为它10+。。和10-。。。

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

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

    0 回复  |  直到 5 年前
        1
  •  0
  •   Everett    5 年前

    Timex 这是一个有用的图书馆,为这些类型的东西。

    这里您可以看到一个使用 Timex.shift/2

    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
  •  0
  •   Zubair Nabi    5 年前

    Timex

    例如

     "US/Pacific"
     |> Timex.now()
     |> Timex.to_datetime()
    
    推荐文章