как правильно изменить эликсир часового пояса - PullRequest
0 голосов
/ 18 июня 2020

Я пытаюсь преобразовать UT C DateTime в некоторые часовые пояса. Мне интересно, каков правильный способ преобразования часового пояса из UT C в желаемый часовой пояс.

, например.

  1. с 1 по июнь. 2020 г. в UT C
  2. с 1 по июнь. 2020 в «Австралия / Брисбен»

Этот часовой пояс на +10 часов, чем UT C.

У меня есть список дат.

например,

DAYS

Теперь каждый день имеет несколько часов. когда вы конвертируете один день из UT C в "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)> 

это в основном правильно и то, что этот метод должен делать, но с ним есть некоторые проблемы.

День в UT C часовой пояс при достижении 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 его больше не 7 июня, но он станет 8 июня.

Я пытаюсь заполнить календарь через это, в котором.

enter image description here

в 14-й день 2 часа, такие как 22 и 23, которые в UT C приходятся на 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 часа, которые наступают не 14 июня, а в часовом поясе Australia/Brisbane, они будут на следующий день.

мой вопрос заключается в том, что имеет право преобразовывать день UT C в другой часовой пояс, где в какой-то момент он переключит полный день, так как это 10 + .. то же самое, что и где это 10 -...

В случае + ve он переходит на следующий день, а в случае -ve - на предыдущий.

Как мы можем преобразовать день UT C в другой часовой пояс где он также покрывает дневную смену или есть какой-нибудь лучший способ справиться с этим?

Ответы [ 2 ]

0 голосов
/ 19 июня 2020

Использование Timex

например,

 "US/Pacific"
 |> Timex.now()
 |> Timex.to_datetime()
0 голосов
/ 18 июня 2020

Timex - полезная библиотека для подобных вещей.

Здесь вы можете увидеть простой пример использования функции Timex.shift/2. Это был бы допустимый подход, если вы знаете смещение UT C, с которым вы работаете:

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(). Вы можете видеть, что смещение изменяется, если вы вводите в эту функцию другое время, например, наблюдайте, как летнее время влияет на смещение часового пояса, когда мы смотрим на дату в январе по сравнению с датой в июле:

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))>

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...