разобрать дату javascript в формате эликсира - PullRequest
0 голосов
/ 24 февраля 2019

У меня есть некоторые сохраненные даты в JavaScript с использованием new Date(), которое выглядит следующим образом:

"Вс 24 февраля 2019 14:44:20 GMT + 0200 (стандартное время Восточной Европы)"

Я пытаюсь разобрать их на эликсир DateTime;В "timex" я не нашел ничего, что могло бы помочь, и я уже знаю, что могу использовать DateTime.from_iso8601, но для дат, сохраненных с использованием new Date().toISOString(), но мне нужно разобрать приведенную выше строку.

Спасибозаранее

Ответы [ 2 ]

0 голосов
/ 25 февраля 2019

Я не нашел в "timex" ничего, что могло бы помочь

Документы Timex говорят, что вы можете использовать strftime последовательности, например %H:%M:%S, для разбора.Вот список символов strftime и их совпадений.

Вот строка формата, которую, я думаю, должен работать на javascript. Даты:

  def parse_js_date() do
    Timex.parse!("Sun Feb 24 2019 14:44:20 GMT+0200 (Eastern European Standard Time)", 
                 "%a %b %d %Y %H:%M:%S GMT%z (%Z)",
                 :strftime)
  end

К сожалению, %Z не хочет совпадать с именем часового пояса,что заставляет Timex.parse!() выплевывать ошибку.Похоже, что %Z в Elixir соответствует только одному слову, например, сокращение часового пояса EET.Поэтому мое простое, чистое решение испорчено.

Что вы можете сделать - отрубить имя часового пояса перед анализом строки даты:

def parse_js_date_string() do

    [date_str|_tz_name] = String.split(
        "Sun Feb 24 2019 14:44:20 GMT+0200 (Eastern European Standard Time)",
        " (", 
        parts: 2
    )

    Timex.parse!(date_str,
                 "%a %b %d %Y %H:%M:%S GMT%z",
                :strftime)
  end

В iex:

~/elixir_programs/my$ iex -S mix
Erlang/OTP 20 [erts-9.3] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:10] [hipe] [kernel-poll:false]
Compiling 1 file (.ex)
Interactive Elixir (1.6.6) - press Ctrl+C to exit (type h() ENTER for help)

iex(1)> My.parse_js_date_string()
#DateTime<2019-02-24 14:44:20+02:00 +02 Etc/GMT-2>

iex(2)> 
0 голосов
/ 24 февраля 2019

Вы можете использовать двоичное сопоставление с образцом эликсира для извлечения частей даты и анализа с использованием формата RFC1123 Timex.RFC1123 имеет формат e.g Tue, 05 Mar 2013 23:25:19 +0200.Запустите h Timex.Format.DateTime.Formatters.Default в iex, чтобы увидеть другие форматы.

iex> date_string = "Sun Feb 24 2019 14:44:20 GMT+0200 (Eastern European Standard Time)"

iex> <<day_name::binary-3,_,month_name::binary-3,_,day::binary-2,_,year::binary-4,_,time::binary-8,_::binary-4,offset::binary-5,_,rest::binary>> = date_string

iex> Timex.parse("#{day_name}, #{day} #{month_name} #{year} #{time} #{offset}", "{RFC1123}")

iex> {:ok, #DateTime<2019-02-24 14:44:20+02:00 +02 Etc/GMT-2>}

Сопоставление с образцом: двоичный размер указан в байтах.1 байт == 1 символНапример, чтобы получить 3-символьный day_name размер равен 3. Символ подчеркивания (_) используется для сопоставления шаблонов с пробелами в формате даты

Обновленный ответ для использования binary-size вместо битовой строки-размер для простоты

...