2015-08-11 21 views
13

Sono nuovo di Elixir, provando a portare un'API Rails a Phoenix come progetto di apprendimento.Formattazione di un tempo in elisir

Ho un Postgres campo tempo, che ho aggiunto ad un regime di Ecto:

field :start_time, Ecto.Time 

Problema: mi piacerebbe uscita una versione formattata di 12 ore di un tempo come 16:30 come stringa: 4:30 pm, per esempio. Ho avuto problemi a trovare un modo facile/standard per farlo.

Questo è il più vicino che ho ancora giunta ad una soluzione:

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 

Questo mi sembra un pezzo ridicolo e assurdamente lunghi di codice per qualcosa che immagino già dispone di un'implementazione più conciso e di serie; inoltre ha il problema di emettere 2: 0pm invece di 2:00 pm - la formattazione dello 0 con uno zero finale era anche un pezzo di codice lungo e complicato su cui stavo lavorando - a quel punto ho iniziato a sentire che le cose stavano andando via fuori pista.

Consiglio apprezzato!

risposta

9

È possibile utilizzare i servizi di formattazione di timex poiché lo si sta già utilizzando, ma prima è necessario modificare il Ecto.Time in un Timex.DateTime che può essere formattato con quelli.

use Timex 

{{0, 0, 0}, Ecto.Time.to_erl(time)} 
|> Timex.Date.from 
|> DateFormat.format!("{h12}:{0m} {am}") 
+0

Questa è una versione più pulita della stessa soluzione con cui ho finito, quindi i minuti sono ancora scarsamente formattati come 2: 0 anziché 2:30 pm. –

+0

Grazie per il suggerimento Pawel, questo mi ha aiutato a trovare una soluzione! –

+0

Oops, ci siamo dimenticati. È necessario utilizzare la direttiva di formato '{0m}' per i minuti da eseguire con gli zeri. –

5

Ho avuto lo stesso problema e utilizzando una libreria come Timex. Questo è il mio modo di gestire le date. Non so se ci sono casi di lavoro migliori.

  • Calendar per l'analisi e alcune funzioni.
  • Calecto per l'utilizzo Calendar con Ecto

In questo caso è possibile utilizzare Calendar.Strftime una stringa data/ora formattata.

Spero che aiuti.

+0

Grazie per il consiglio @ Fabi755 –

6

Si sta utilizzando Timex, ma non il suo metodo format! che consente una facile formattazione di ora e data.

https://david.padilla.cc/posts/19-date-formatting-in-phoenix-elixir è una buona scrittura sull'utilizzo di Timex.

sembra che si potrebbe essere in grado di fare qualcosa di simile al seguente:

Timex.DateFormat.format!(time, "%H:%M%P", :strftime) 

Vedere https://github.com/bitwalker/timex/blob/master/lib/format/datetime/formatters/strftime.ex per l'elenco completo delle opzioni di formattazione.

+0

Questo non funziona per me, sto ottenendo una clausola di nessuna funzione corrispondente in Timex.DateFormat.format!/3 - Penso che sia correlata al fatto che ho un tempo non un datetime? –

+0

Grazie per il consiglio sevenseacat - questo non mi ha portato a termine del tutto ma con il consiglio di Pawel Obrok mi ha aiutato a mettermi sulla strada giusta! –

1

Questa è la soluzione praticabile che sono arrivato in cui era una combinazione delle risposte da Pawel Obrok e sevenseascat - con l'aggiunta di ottenere i minuti nel formato 00.

def formatted_time(time) do {{0, 0, 0}, Ecto.Time.to_erl(time)} |> Timex.Date.from |> DateFormat.format!("%I:%M%P", :strftime) end

+0

Buono a sentirlo è stato risolto :) Non ero sicuro della conversione esatta tra un Ecto.Time e un Timex.Time, ma sono felice di poter aiutare a prescindere! – sevenseacat

1

Un modo semplice per farlo è quello di utilizzare strftime stringa di formattazione disponibili in Calendar. Utilizzando Calecto puoi persino utilizzare i tipi di base come Ecto.Time o Ecto.DateTime. Questo può essere convogliato direttamente alla formattazione Calendar s', in questo modo:

@ecto_struct.some_time |> Calendar.Strftime.strftime! "%I:%M%P" 

si tradurrà in:

"02:30pm" 

Tutto quello che dovete fare è aggiungere Calecto come dipendenza:

defp deps do 
    [ {:calecto, "~> 0.4.1"}, ] 
end 
+0

Grazie a @lau hai visto il tuo discorso su ElixirConf e avrai un punto di controllo su queste librerie! –