Packages

A parsing library for articles written in Arcdown (.ad) format.

Current section

Files

Jump to
arcdown lib arcdown parsers datetime_parser.ex
Raw

lib/arcdown/parsers/datetime_parser.ex

defmodule Arcdown.Parsers.DateTimeParser do
@moduledoc """
A module for parsing human-readable date and time formats into native
Elixir entities.
"""
@patterns %{
date: ~r/(?<month>\d{1,2})\/(?<day>\d{1,2})\/(?<year>\d{4})$/,
time: ~r/(?<hour>\d{1,2}):(?<minute>\d{2})(?<meridiem>[ap]m)$/
}
@spec parse_human_12h(binary(), binary()) :: {:ok, DateTime.t()}
def parse_human_12h(date, time) do
%{"month" => month, "day" => day, "year" => year} = Regex.named_captures @patterns[:date], date
%{"hour" => hour, "minute" => minute, "meridiem" => meridiem} = Regex.named_captures @patterns[:time], time
hour = case meridiem do
"am" -> hour
"pm" ->
{hour, _} = Integer.parse hour
"#{hour + 12}"
end
hour = :string.pad hour, 2, :leading, "0"
month = :string.pad month, 2, :leading, "0"
day = :string.pad day, 2, :leading, "0"
DateTime.from_iso8601("#{year}-#{month}-#{day}T#{hour}:#{minute}:00Z")
end
end