2015-08-11 17 views
13

Tôi là người mới đến Elixir, đang cố gắng chuyển một API Rails sang Phoenix như một dự án học tập.Định dạng thời gian ở Elixir

Tôi có một Postgres thời gian lĩnh vực, mà tôi đã thêm vào một chương trình Ecto:

field :start_time, Ecto.Time 

Vấn đề: Tôi muốn đầu ra một phiên bản được định dạng 12-giờ của một ví dụ như 16:30 như một chuỗi: 4:30 chiều. Tôi đã gặp khó khăn khi tìm cách dễ dàng/tiêu chuẩn để thực hiện việc này.

này là gần nhất tôi đã chưa đi đến một giải pháp:

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 

Điều này có vẻ giống như một mảnh vô lý và nực cười dài của mã cho một cái gì đó tôi tưởng tượng đã có thực hiện ngắn gọn hơn và tiêu chuẩn; ngoài ra nó có vấn đề xuất ra 2: 0pm thay vì 2:00 pm - định dạng 0 với dấu 0 là đoạn mã dài và phức tạp mà tôi đang làm - vào thời điểm đó tôi bắt đầu cảm thấy như mọi thứ đang diễn ra đường tắt.

Tư vấn được đánh giá cao!

Trả lời

9

Bạn có thể sử dụng các tiện ích định dạng của timex vì bạn đã sử dụng, nhưng trước tiên bạn cần thay đổi Ecto.Time thành Timex.DateTime có thể được định dạng bằng các cấu hình đó.

use Timex 

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

Đây là phiên bản sạch hơn của cùng một giải pháp mà tôi đã kết thúc, vì vậy các phút vẫn được định dạng kém là 2: 0pm thay vì 2:30 chiều. –

+0

Cảm ơn Pawel đã giúp tôi giải quyết! –

+0

Rất tiếc, đã quên mất điều đó. Bạn cần sử dụng chỉ thị định dạng '{0m}' cho phút để đệm bằng số không. –

5

Tôi gặp sự cố tương tự và sử dụng thư viện như Timex. Đó là cách tôi xử lý ngày tháng. Tôi không biết nếu có trường hợp làm việc tốt hơn.

  • Calendar để phân tích cú pháp và một số chức năng.
  • Calecto cho việc sử dụng Calendar với Ecto

Trong trường hợp này bạn có thể sử dụng Calendar.Strftime cho một chuỗi ngày/giờ được định dạng.

Tôi hy vọng điều đó sẽ hữu ích.

+0

Cảm ơn lời khuyên @ Fabi755 –

6

Bạn đang sử dụng Timex, nhưng không sử dụng phương thức format! cho phép định dạng ngày và giờ dễ dàng.

https://david.padilla.cc/posts/19-date-formatting-in-phoenix-elixir là cách viết hay về cách sử dụng Timex.

Dường như bạn có thể có thể làm điều gì đó như sau:

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

Xem https://github.com/bitwalker/timex/blob/master/lib/format/datetime/formatters/strftime.ex cho đầy đủ danh sách các tùy chọn định dạng.

+0

Điều này không có tác dụng đối với tôi, tôi nhận được một mệnh đề không khớp hàm trong Timex.DateFormat.format!/3 - Tôi nghĩ rằng có liên quan thực tế là tôi có thời gian không phải là một ngày giờ? –

+0

Cảm ơn lời khuyên của bảy người - điều này đã không đưa tôi đến đó hoàn toàn nhưng cùng với lời khuyên của Pawel Obrok đã giúp tôi đi đúng hướng! –

1

Đây là giải pháp khả thi mà tôi đã kết hợp với câu trả lời từ Pawel Obrok và sevenseascat - với việc thêm phút vào định dạng 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

Thật tốt khi nghe nó đã được giải quyết :) Tôi không chắc chắn về việc chuyển đổi chính xác giữa một Ecto.Time và một Timex.Time, nhưng tôi vui vì tôi có thể giúp đỡ bất kể! – sevenseacat

1

Một cách đơn giản để làm điều đó là sử dụng strftime chuỗi định dạng có sẵn trong Calendar. Sử dụng Calecto thậm chí bạn có thể sử dụng các loại cơ bản như Ecto.Time hoặc Ecto.DateTime. Điều này có thể được đường ống trực tiếp đến định dạng Calendar 's, như vậy:

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

sẽ dẫn đến:

"02:30pm" 

Tất cả bạn phải làm là thêm Calecto như một sự phụ thuộc:

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

Cảm ơn @lau đã thấy bài nói chuyện của bạn tại ElixirConf và sẽ làm cho một điểm kiểm tra các thư viện này! –

Các vấn đề liên quan