2011-11-02 49 views
12

Làm cách nào tôi có thể nhận được đối tượng Thời gian ruby ​​đại diện cho ngày bắt đầu của ngày vào một ngày cụ thể trong một múi giờ nhất định.Nhận đối tượng thời gian vào ngày bắt đầu trong một múi giờ cụ thể

+0

Chỉ là một nhận xét vì tôi không biết gì về xử lý múi giờ của Ruby: nửa đêm không phải lúc nào cũng tồn tại và có thể xảy ra hai lần. Brazil thay đổi đồng hồ của nó vào lúc nửa đêm, ví dụ. Có thể bạn nên tìm ngày bắt đầu của ngày. –

+0

Điểm thú vị. Vì mục đích của tôi, ngày bắt đầu là ngày tôi thích. Cảm ơn Jon. Tôi sẽ cập nhật câu hỏi. –

+0

Trường hợp sử dụng thực tế của bạn là gì? (Tôi đã tìm thấy câu hỏi này vì tôi muốn có được nửa đêm gần đây nhất ở California, như UTC, để theo dõi hạn ngạch API.) –

Trả lời

6

tôi đã kết thúc bằng cách sử dụng phương pháp #local trên ActiveSupport::TimeZone đối tượng p các thành phần của đối tượng Date.

# Get example date and time zone... 
date = Date.today 
timezone = ActiveSupport::TimeZone['America/New_York'] 

# Get beginning of day for date in timezone 
timezone.local(date.year, date.month, date.day) 
10
date = Date.today 

date.to_time.in_time_zone('America/New_York').beginning_of_day 

Hiện kết quả đầu ra => 2011-11-02 00:00:00 -0400

Time.now.in_time_zone('Asia/Shanghai').beginning_of_day 

Hiện kết quả đầu ra => 2011-11-03 00:00:00 +0800

date = Date.today 

date.to_time.in_time_zone('Asia/Shanghai').beginning_of_day 

Hiện kết quả đầu ra => 2011-11-02 00:00:00 +0800

+1

Tôi ước rằng điều đó thật đơn giản. Thật không may, không có gì đảm bảo rằng thời gian bạn đến, sau khi chuyển đổi múi giờ, là trong cùng một ngày. Đôi khi nó sẽ được và đôi khi nó sẽ không phụ thuộc vào khu vực bắt đầu và kết thúc. Tôi cho rằng tôi có thể so sánh thành phần ngày sau khi chuyển đổi với giá trị ban đầu và điều chỉnh nếu cần thiết nhưng điều đó thực sự rất khó khăn. Những gì tôi hy vọng là một cách thanh lịch để làm điều đó luôn luôn hoạt động. Hy vọng rằng có một cái gì đó trong api, tôi không nghĩ rằng đây là một điều điên rồ muốn làm. –

+0

Tôi có thể không hiểu hoàn toàn những gì bạn đang cố gắng làm nhưng 'date.to_time.in_time_zone ('TIMEZONE'). Start_of_day' cung cấp cho bạn 00:00:00 UTC cho ngày được chỉ định ban đầu. –

+1

Nó không cung cấp cho bạn 0 UTC, nó cung cấp cho bạn 0 trong múi giờ, đó là thích hợp hơn. Tuy nhiên, nó không làm điều này trước khi chuyển đổi múi giờ với in_time_zone để ngày không nhất thiết phải hợp lệ nữa. Đây là ví dụ về ý tôi. 'date.to_time.in_time_zone ('Asia/Shanghai'). midnight.in_time_zone (Time.zone) .midnight # => Một ngày trong quá khứ.'. Lý tưởng nhất, ruby ​​nên cho phép tôi làm điều gì đó như thế này. 'date.to_time (zone)'. –

5

Không chắc chắn nếu điều này giúp, nhưng điều này được tôi thời gian mà tại đó hạn ngạch Google API của tôi reset:

# The most recent midnight in California in UTC time 
def last_california_midnight 
    (Time.now.utc - 7.hours).midnight + 7.hours 
end 

tôi sử dụng nó như thế này với Mongoid, ví dụ:

def api_calls_today 
    Call.where(updated_at: { '$gte' => last_california_midnight }).count 
end 

Thao tác này sẽ hoạt động bất kể múi giờ được triển khai cho đến khi nào Mongo được đặt thành UTC.

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