2015-08-11 12 views
13

Jestem nowy w Elixir, próbując przenieść interfejs Rails API do Phoenix jako projekt do nauki.Formatowanie czasu w eliksiru

Mam PostgreSQL pola czasu, które dodałem do programu ekto:

field :start_time, Ecto.Time 

Problem: Chciałbym wyjście 12-godzinny sformatowaną wersję czas taki jak 16:30 jako ciąg znaków: 16:30, na przykład. Mam problem ze znalezieniem łatwego/standardowego sposobu robienia tego.

To jest najbliżej mam jeszcze dojść do rozwiązania:

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 

Wydaje się to śmieszne i absurdalnie długi kawałek kodu na coś ja już sobie wyobrazić jest bardziej zwięzły i standardowego wdrożenia; poza tym ma problem z wyjściem 2: 0pm zamiast 14:00 - formatowanie 0 z końcowym zerem było dodatkowo długim i skomplikowanym kodem, nad którym pracowałem - w którym momencie zacząłem czuć, że wszystko idzie droga poza tory.

Porady doceniane!

Odpowiedz

9

Można użyć funkcji formatowania timex, ponieważ już jej używasz, ale najpierw musisz zmienić swój Ecto.Time na Timex.DateTime, który można z nich sformatować.

use Timex 

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

To jest czystsza wersja tego samego rozwiązania, z którego skorzystałem, więc minuty są nadal słabo sformatowane jako 2: 0pm zamiast 14:30. –

+0

Dzięki za podpowiedź Pawel, pomogło mi to znaleźć rozwiązanie! –

+0

Ups, zapomniałem o tym. Musisz użyć dyrektywy w formacie '{0m}', aby minutę zastąpić zerami. –

5

Miałem ten sam problem i korzystałem z biblioteki takiej jak Timex. Oto mój sposób obchodzenia się z datami. Nie wiem, czy istnieją lepsze przypadki pracy.

  • Calendar do parsowania i niektórych funkcji.
  • Calecto za korzystanie Calendar z Ecto

W tym przypadku można użyć Calendar.Strftime na sformatowanej ciąg daty/czasu.

Mam nadzieję, że to pomaga.

+0

Dziękuję za poradę @ Fabi755 –

6

Używasz Timex, ale nie jego metody format!, która pozwala na łatwe formatowanie czasu i daty.

https://david.padilla.cc/posts/19-date-formatting-in-phoenix-elixir jest dobrym zapisem na temat korzystania z Timex.

Wygląda na to, że możesz być w stanie coś zrobić jak poniżej:

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

Zobacz https://github.com/bitwalker/timex/blob/master/lib/format/datetime/formatters/strftime.ex do pełnej listy opcji formatowania.

+0

To nie działa dla mnie, otrzymuję klauzulę o braku funkcji pasujące w Timex.DateFormat.format!/3 - Myślę, że powiązane do faktu, że mam czas, a nie datetime? –

+0

Dzięki za poradę sevenseacat - nie dotarło to do mnie całkowicie, ale wraz z poradą Pawła Obroka pomogło mi to na dobrej drodze! –

1

Jest to wykonalne rozwiązanie, że przybył, który był kombinacją odpowiedzi z Pawłem Obrok i sevenseascat - z dodatkiem coraz minucie formacie 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

Dobrze jest usłyszeć, że został rozwiązany :) Nie byłem pewien dokładnej konwersji między Ecto.Time i Timex.Time, ale cieszę się, że mogłem pomóc niezależnie! – sevenseacat

1

Prostym sposobem, aby to zrobić jest użycie strftime ciąg formatowania dostępne w Calendar. Za pomocą Calecto można nawet używać podstawowych typów, takich jak Ecto.Time lub Ecto.DateTime. To może być wyprowadzony bezpośrednio do formatowania Calendar „s, tak jak poniżej:

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

spowoduje:

"02:30pm" 

Wszystko co musisz zrobić, to dodać Calecto jako zależność:

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

Dzięki @lau zobaczyłem twoją rozmowę w ElixirConf i zrobię punkt sprawdzenia tych bibliotek! –