Es wurde darum gebeten, die Zeit für Ereignisse wie Besprechungen unter Berücksichtigung aller Zeitzonen zu speichern.
Zum Beispiel Meeting1 findet ab 11:00 Uhr in Tokio statt. Meeting2 findet ab 10:00 Uhr UTC statt.
Ich möchte so etwas ausdrücken.
--Fixieren Sie die Standardzeitzone des Rails-API-Servers.
Zunächst muss Rails mehrere Zeitzonen berücksichtigen.
https://qiita.com/joker1007/items/2c277cca5bd50e4cce5e
Dieses Mal habe ich alle Zeitzonen unten auf UTC gesetzt, um Verwirrung zu vermeiden.
Speichern Sie die Referenzvariable, die die Zeitzone ändert. Da die Zeitzone über ActiveSupport geändert wird, können Sie die folgende Validierung schreiben, damit der gültige Wert gespeichert wird.
# tz :string
class Meeting < ApplicationRecord
validates :tz, inclusion: { in: ActiveSupport::TimeZone::MAPPING.values }, presence: true
end
Wenn die API einen Wert zurückgibt, fügen wir eine Logik ein, die die Zeitzone dynamisch ändert und die Zeit zurückgibt. In diesem Fall habe ich es in Serialzer integriert. Da diese Logik mit der Anzeige zusammenhängt, haben wir beschlossen, sie in eine Ebene in der Nähe von Ansicht zu legen.
# tz :string
class Meeting < ApplicationRecord
~~
def timezone
ActiveSupport::TimeZone.new(tz)
end
def use_timezone
Time.use_zone(timezone) do
yield
end
end
end
class MeetingSerializer
attribute :start_time do |record|
record.use_timezone do
record.start_time
end
end
end
# actieve_
[47] pry(main)> meeting
=> #<Meeting:0x00007ff2c7ad4618
id: "162b1ed7-5502-42f8-8bed-592d2dae7db1",
start_at: Mon, 05 Oct 2020 16:00:00 UTC +00:00,
created_at: Tue, 06 Oct 2020 06:28:39 UTC +00:00,
updated_at: Thu, 08 Oct 2020 02:11:54 UTC +00:00>
[48] pry(main)> meeting.start_at="2020-10-06T01:00:00+0900"
=> "2020-10-06T01:00:00+0900"
[49] pry(main)> meeting.start_at
=> Mon, 05 Oct 2020 16:00:00 UTC +00:00
module ValidateTimeFormat
class TimeFormatError < StandardError
end
extend ActiveSupport::Concern
included do
rescue_from ValidateTimeFormat::TimeFormatError, with: :render_time_format_error
end
TIME_FORMAT = '%FT%T%z'
def render_time_format_error(msg)
render json: { message: msg }, status: :bad_request
end
def validate_time_format(time_str)
DateTime.strptime(time_str, TIME_FORMAT).zone
rescue Date::Error
raise ValidateTimeFormat::TimeFormatError, :time_format_is_invalid
end
end
Rails hatte ein Bild, das im Zeitsystem viele Punkte zu beachten hat. Mit dieser Implementierung habe ich vollständig verstanden ()
https://twitter.com/yoshixj
Recommended Posts