【问题标题】:Timex.to_naive_datetime subtracts an hourTimex.to_datetime 减去一个小时
【发布时间】:2019-09-13 16:00:13
【问题描述】:

调用Timex.to_naive_datetime 转换为没有时区的天真日期时间会从输入日期时间中减去一个小时

我尝试过其他时区,排除了夏令时转换的可能性。

d = %DateTime{
  year: 2000,
  month: 2,
  day: 29,
  zone_abbr: "CET",
  hour: 23,
  minute: 0,
  second: 7,
  microsecond: {0, 0},
  utc_offset: 3600,
  std_offset: 0,
  time_zone: "Europe/Warsaw"
}
#=> # DateTime<2000-02-29 23:00:07+01:00 CET Europe/Warsaw>

Timex.to_naive_datetime(d)
#=> ~N[2000-02-29 22:00:07]

d2 = %DateTime{
  year: 2019,
  month: 3,
  day: 2,
  zone_abbr: "PST",
  hour: 23,
  minute: 0,
  second: 7,
  microsecond: {0, 0},
  utc_offset: 3600,
  std_offset: 0,
  time_zone: "America/Los_Angeles"
}
#=> #DateTime<2019-03-02 23:00:07+01:00 PST America/Los_Angeles>

Timex.to_naive_datetime(d2)
#=> ~N[2019-03-02 22:00:07]

我希望将第一个日期时间转换为~N[2000-02-29 23:00:07],但输出为~N[2000-02-29 22:00:07]

【问题讨论】:

    标签: datetime elixir


    【解决方案1】:

    您创建的两个结构都包含utc_offset: 3600,即UTC+1。

    #DateTime<2000-02-29 23:00:07+01:00 CET Europe/Warsaw>
    #DateTime<2019-03-02 23:00:07+01:00 PST America/Los_Angeles>
    

    +01:00 是如何到达 America/Los_Angeles 的?它对该时区无效。如果我使用标准函数之一生成日期:

    d3 = Timex.to_datetime({{2019,3, 2}, {23, 0, 7}}, "America/Los_Angeles")
    #=> #DateTime<2019-03-02 23:00:07-08:00 PST America/Los_Angeles>
    Timex.to_naive_datetime(d3)
    #=> ~N[2019-03-03 07:00:07]
    

    我得到了正确的时区偏移量。 Timex.to_naive_datetime/1 似乎返回时区的 UTC 值。如果只想删除时区信息,可以使用DateTime.to_naive/1

    d1
    #=> #DateTime<2000-02-29 23:00:07+01:00 CET Europe/Warsaw>
    DateTime.to_naive(d1)
    #=> ~N[2000-02-29 23:00:07]
    

    【讨论】:

    • 这个。现在是 2019 年,DateTime 足够强大,通常可以避免使用Timex。在v1.0 时代它很棒,但现在没有什么不能用简单的DateTime 做。
    • 如果它回答了您的问题,请点击左侧的复选标记,谢谢。
    猜你喜欢
    • 1970-01-01
    • 2015-05-13
    • 1970-01-01
    • 1970-01-01
    • 2012-08-03
    • 1970-01-01
    • 1970-01-01
    • 2020-09-12
    • 1970-01-01
    相关资源
    最近更新 更多