defmodule TestTimex do defmodule Timex do def now(timezone \\ "UTC") do case timezone do "UTC" -> DateTime.utc_now() tz when is_binary(tz) and tz != "" -> DateTime.utc_now() _ -> {:error, :invalid_timezone} end end def year(datetime) when is_struct(datetime, DateTime), do: datetime.year def hour(datetime) when is_struct(datetime, DateTime), do: datetime.hour def day(datetime, :ordinal) when is_struct(datetime, DateTime) do date = DateTime.to_date(datetime) start_of_year = Date.new!(date.year, 1, 1) Date.diff(date, start_of_year) + 1 end def format!(datetime, format, :strftime) when is_struct(datetime, DateTime) do case format do "%m%d%H%M%S" -> "#{String.pad_leading("#{datetime.month}", 2, "0")}" <> "#{String.pad_leading("#{datetime.day}", 2, "0")}" <> "#{String.pad_leading("#{datetime.hour}", 2, "0")}" <> "#{String.pad_leading("#{datetime.minute}", 2, "0")}" <> "#{String.pad_leading("#{datetime.second}", 2, "0")}" _ -> DateTime.to_iso8601(datetime) end end end end now = TestTimex.Timex.now() IO.puts("Current datetime: #{inspect(now)}") IO.puts("Year: #{TestTimex.Timex.year(now)}") IO.puts("Hour: #{TestTimex.Timex.hour(now)}") IO.puts("Day of year: #{TestTimex.Timex.day(now, :ordinal)}") IO.puts("Formatted: #{TestTimex.Timex.format!(now, "%m%d%H%M%S", :strftime)}") IO.puts("All Timex functions work correctly!")