2011-11-02 3 views
12

주어진 표준 시간대의 특정 날짜에 해당 날짜의 시작을 나타내는 루비 시간 개체를 어떻게 얻을 수 있습니까?특정 시간대의 시작 시간 개체 가져 오기

+0

Ruby의 시간대 처리에 대해 잘 모르는 의견 : 자정이 항상 존재하는 것은 아니며 두 번 발생할 수 있습니다. 예를 들어 브라질은 자정에 시계를 변경합니다. 대신 하루의 시작을 찾아야합니다. –

+0

흥미로운 점. 내 목적을 위해 오늘의 시작은 내가 관심을 갖고있는 것입니다. 존 감사합니다. 나는 그 질문을 갱신 할 것이다. –

+0

실제 사용 사례는 무엇입니까? (API 할당량 추적을 위해 UTC처럼 가장 최근 자정을 캘리포니아에서 받고 싶었 기 때문에이 질문을 발견했습니다.) –

답변

6

I는 ActiveSupport::TimeZone 물 (P)의 방법을 이용 #local 끝내 Date 개체의 구성 요소를 assing.

# 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 

현재 = "2011-11-02 0시 0분 0초 -0400

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

현 출력 ="2011-11-03 0,800 0시 0분 0초

date = Date.today 

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

현재 출력 = "2011-11-02 0,800 0시 0분 0초

+1

그게 간단했다. 불행히도, 시간대 변환 후 도착한 시간이 같은 날임을 보장 할 수는 없습니다. 때로는 시작과 끝 부분에 의존하지 않을 수도 있습니다. 나는 원래 값으로 변환 후 날짜 구성 요소를 비교하고 필요한 경우 조정할 수 있다고 생각하지만 그건 정말 까다 롭습니다. 내가 바라는 것은 그것을 항상 할 수있는 우아한 방법입니다. 다행히 api에 무언가가 있습니다. 나는 이것이하고 싶지 않은 미친 짓이라고 생각하지 않습니다. –

+0

'date.to_time.in_time_zone ('TIMEZONE'). beginning_of_day'는 원래 지정된 날짜에 대해 00:00:00 UTC를 제공합니다. –

+1

그것은 UTC를주지 않으며, 시간대에서 0을 제공합니다. 이는 바람직합니다. 하지만 날짜가 반드시 더 이상 유효하지 않도록 in_time_zone으로 시간대를 변환하기 전에는이 작업을 수행하지 않습니다. 여기에 제가 의미하는 바가 있습니다. 'date.to_time.in_time_zone ('Asia/Shanghai'). midnight.in_time_zone (Time.zone) .midnight # => 과거 어느 날 .'. 이상적으로, 루비는 내가 이와 같은 것을하도록 허용해야합니다. 'date.to_time (zone)'. –

5

확실하지 않음이하지만이 나에게 내 Google API 할당량이 재설정 된 시간 얻는 경우에 :

def api_calls_today 
    Call.where(updated_at: { '$gte' => last_california_midnight }).count 
end 
: 예를 들어,

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

을 내가 Mongoid와 같이 사용을

Mongo를 UTC로 설정하면 코드가 배포되는 시간대에 상관없이 작동합니다.

관련 문제