2015-04-22 16 views
5

Tôi không đề cập đếnTrong Ruby hoặc Rails, cách tốt nhất để chuyển đổi Giờ Miền Đông thành UTC là gì?

myDateTime = DateTime.now 
myDateTime.new_offset(Rational(0, 24)) 

hoặc

Time.now.utc 

gì tôi có là một ngày văn bản được đưa ra trong Eastern Time.

Tôi có thể chuyển đổi ngày văn bản đó thành Ngày giờ. Hãy gọi nó là eastern_date_time.

Bây giờ, chúng tôi có một biến có chứa một DateTime, nhưng không có gì biết đó là phía đông bên cạnh chúng tôi. Chuyển đổi bản thân nó sẽ khá nặng nề. Nếu ngày trong giờ tiết kiệm ánh sáng ban ngày (DST) (từ ngày 8 đến ngày 1 tháng 11 năm nay), chúng tôi sẽ phải thêm 4 giờ nữa để chuyển sang UTC, và nếu ngày ở Giờ chuẩn (ST), chúng tôi sẽ phải thêm 5 giờ vào biến east_date_time của chúng tôi.

Làm cách nào chúng tôi có thể xác định rằng chúng tôi có thời gian là ngày giờ miền Đông và sau đó chuyển đổi thành UTC ... thứ gì đó sẽ xác định xem ngày có nằm trong DST/ST hay không và áp dụng 4 hoặc 5 giờ đúng cách?

Tôi muốn chuyển đổi bất kỳ loại ngày nào tôi nhận được vào UTC, để lưu trữ trong cơ sở dữ liệu của tôi.

EDIT:

Sử dụng `in_time_zone', tôi không thể để chuyển đổi chữ Time Đông của tôi để UTC. Làm thế nào tôi có thể đạt được mục tiêu đó? Ví dụ:

text_time = "Nov 27, 2015 4:30 PM" #given as Eastern 
myEasternDateTime = DateTime.parse text_time # => Fri, 27 Nov 2015 16:30:00 +0000 
#now we need to specify that this myEasternDateTime is in fact eastern. However, it's our default UTC. If we use in_time_zone, it just converts the date at UTC to Eastern 
myEasternDateTime.in_time_zone('Eastern Time (US & Canada)') # => Fri, 27 Nov 2015 11:30:00 EST -05:00 
myEasternDateTime.utC# => Fri, 27 Nov 2015 16:30:00 +0000 

Đó không phải là điều chúng tôi muốn. Chúng tôi phải xác định rằng myEasterDateTime thực tế là ở miền đông ... để khi chúng tôi thực hiện một số myEasterDateTime.utc vào 16:30:00, chúng tôi sẽ nhận được 20:30:00.

Tôi làm cách nào để thực hiện việc này?

Trả lời

1

tôi đã nhận nó như thế này với sự giúp đỡ của đề xuất múi giờ.

time_text_1 = "Apr 20, 2015 4:30PM" #Scraped as an Eastern Time, with no offset of -5:00 from UTC included 
time_text_2 = "Nov 20, 2015 4:30PM" #Scraped as an Eastern Time, with no offset of -5:00 from UTC included 

Time.zone = 'Eastern Time (US & Canada)' 
my_time_1 = Time.zone.parse time_text_1 # Output: Mon, 20 Apr 2015 16:30:00 EDT -04:00 
my_time_2 = Time.zone.parse time_text_2 # Output: Fri, 20 Nov 2015 16:30:00 EST -05:00 

my_time_1.utC# Output: 2015-04-20 20:30:00 UTC 
my_time_2.utC# Output: 2015-11-20 21:30:00 UTC 
2

Có một time_in_zone method in the DateTime class:

now.time_in_zone('UTC') 

Nó đã được renamed to in_time_zone:

DateTime.now.in_time_zone('US/Pacific') 
=> Wed, 22 Apr 2015 12:36:33 PDT -07:00 
+0

nơi tôi có thể nhận danh sách tất cả các múi giờ như 'US/Eastern'. Có lệnh nào không? –

+1

'ActiveSupport :: TimeZone.zones_map.values.collect {| z | z.name} ' – hd1

+0

Tôi không thể tìm ra cách chuyển đổi Ngày văn bản phương Đông thành Giờ miền Đông, và sau đó nhận được tương đương UTC với phương thức in_time_zone. Tôi đã thêm một EDIT vào bài đăng gốc. –

1

Các đối tượng của lớp Time có một phương pháp gọi là dst? mà về cơ bản sẽ cho bạn biết hay không DST được áp dụng hoặc không phải. Vì vậy, về cơ bản bạn có thể xác định liệu DST/ST có thể áp dụng hay không và quyết định nên thêm - 4 hoặc 5.

ví dụ: Time.now.dst? Nếu trả về đúng, hãy thêm 4, nếu không thì thêm 5.

+0

Bạn có thể tìm thêm thông tin tại đây - http://apidock.com/rails/ActiveSupport/TimeWithZone/dst%3F – Jerry

1

Trong bài đăng đã chỉnh sửa, chuỗi thời gian của bạn cần được bù đắp từ UTC.

EDIT III: Dựa trên các ý kiến ​​(chỉ có một chuỗi thiết lập để đại diện cho Đông Thời gian và cần phải giải thích cho DST vv)

text_time = "Nov 27, 2015 4:30 PM" 
the_offset = Time.zone_offset('EST')/(60*60) 
eastern_time = DateTime.parse(text_time).change(offset: the_offset.to_s) # Fri, 27 Nov 2015 16:30:00 -0500 
eastern_time.utC# Fri, 27 Nov 2015 21:30:00 +0000 
+0

rất gần có, nó chỉ là văn bản được truyền cho tôi không chứa phần bù. Nó chỉ là một ngày văn bản có nghĩa là được thừa nhận ET. –

+0

Ok. Chỉnh sửa câu trả lời cho tài khoản cho rằng –

+0

tiếc là điều này không hoàn toàn làm công việc, hoặc, như thời gian phương Đông không phải luôn luôn -5 từ UTC (http://www.nhc.noaa.gov/aboututc.shtml - câu cuối cùng cuối cùng đoạn trước hình ảnh). Trong DST nó là -4, nhưng trong ST nó là -5. Cách duy nhất tôi đã có thể làm điều đó cho đến nay, là trong câu trả lời tôi đăng lên câu hỏi ban đầu này, nhưng nó không phải là rất sạch sẽ. Đó là một vài dòng, nhưng như bạn có thể thấy nó xử lý các DST (ví dụ ngày 20 tháng 4 năm 2015) và của ST (ví dụ ngày 20 tháng 11 năm 2015). Dù sao tôi có thể làm sạch nó? –

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