Xử lý format time trong rails

Xin chào các bạn, các bạn làm back-end chắc hẳn đã gặp không ít rắc rối đối với việc format và lưu trữ dữ liệu thời gian trong hệ thống của mình.

Khi mà hệ thống yêu cầu dùng đa quốc gia đồng nghĩa với việc, hệ thống sẽ hiện thị thời gian tưng ứng với zone của từng vùng và đồng thời cũng hiển thị form format theo từng vùng

ví dụ:

  • ở việt nam, chúng ta hay dùng là ngày/tháng/năm
  • ở nhật, có thể là dùng năm/tháng/ngày
  • ...

Vậy làm sao chúng ta có thể xử lý việc đó bây giờ.

Giá trị thời gian chúng ta sẽ hiện thị 2 dạng

  1. dạng hiển thị khi show ra màn hình hệ thống (21:04 28/12/2016)
  2. dạng lưu trữ trong DataBase (2016-12-28 21:04:10 +0700)

vậy làm sao để lưu động linh hoạt 2 dạng này trong hệ thống
Chúng ta sẽ sử dụng 2 công cụ là strftime và strptime

> Time.now.strftime("%H:%M %Y/%m/%d")
=> "21:06 2016/12/28"
> DateTime.strptime("21:06 2016/12/28", "%H:%M %Y/%m/%d")
=> Wed, 28 Dec 2016 21:06:00 +0000

Như chúng ta thấy kết quả, strftime thì không vấn đề gì, nhưng đối với strptime thì sẽ set về zone +0000, vậy nên đẻ được kết quả đúng chúng ta cần update thêm phần time zone cho data

> DateTime.strptime("21:06 2016/12/28", "%H:%M %Y/%m/%d").change(offset: Time.zone.formatted_offset)
=> Wed, 28 Dec 2016 21:06:00 +0900

Nếu muốn chuyển time_zone hệ thống thì mọi người có thể dùng hỗ trợ của ActiveSuport::TimeZone để làm options. Mọi người có thể tham khảo code dưới đây

<%= form_for @user do |f| %>
  <%= f.time_zone_select(:t_zone, ActiveSupport::TimeZone.all.sort, {model: ActiveSupport::TimeZone, default: Time.zone.name}) %>
  <%= f.submit "Change" %>
<% end %>

Trên đây là mình giớ thiệu sơ qua cách để xử lý đối với Time trong hệ thống của ruby

Cám ơn các bạn đã quan tâm theo dõi

Xin chào và hẹn gặp lại ^_^


All Rights Reserved