I'm new to Elixir, trying to port a Rails API to Phoenix as a learning project.
I have a Postgres time field, which I've added to an Ecto scheme:
field :start_time, Ecto.Time
Problem: I'd like to output a 12-hour formatted version of a time such as 16:30 as a string: 4:30pm, for example. I have been having trouble finding an easy/standard way of doing this.
This is the closest I've yet come to a solution:
def format_time(time) do
{:ok, {hours,minutes,y, z}} = Ecto.Time.dump(time)
{hour, ampm} = Timex.Time.to_12hour_clock(hours)
"#{hour}:#{minutes}#{ampm}"
end
This seems like a ridiculous and ridiculously long piece of code for something I imagine already has a more concise and standard implementation; in addition it has the problem of outputting 2:0pm instead of 2:00 pm – formatting the 0 with a trailing zero was additionally long and complicated piece of code that I was working on –– at which point I started feeling like things were going way off track.
Advice appreciated!
I had the same problem and using a library like Timex
.
That's my way how to handle dates. I don't know if there better work cases.
Calendar
with Ecto
In this case you can use Calendar.Strftime for a formatted date/time string.
I hope it helps.
You can use the formatting facilities of timex
since you're already using that, but first you need to change your Ecto.Time
into a Timex.DateTime
that can be formatted with those.
use Timex
{{0, 0, 0}, Ecto.Time.to_erl(time)}
|> Timex.Date.from
|> DateFormat.format!("{h12}:{0m} {am}")
You're using Timex, but not its format!
method which allows for easy time and date formatting.
https://david.padilla.cc/posts/19-date-formatting-in-phoenix-elixir is a good write up on using Timex.
It looks like you might be able to do something like the following:
Timex.DateFormat.format!(time, "%H:%M%P", :strftime)
See https://github.com/bitwalker/timex/blob/master/lib/format/datetime/formatters/strftime.ex for the full list of formatting options.
A simple way to do it is to use strftime
string formatting available in Calendar
. Using Calecto
you can even use the basic types such as Ecto.Time
or Ecto.DateTime
.
This can be piped directly to Calendar
's formatting, like so:
@ecto_struct.some_time |> Calendar.Strftime.strftime! "%I:%M%P"
Will result in:
"02:30pm"
All you have to do is add Calecto
as a dependency:
defp deps do
[ {:calecto, "~> 0.4.1"}, ]
end
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With