2011-11-02 111 views
12

如何获取代表给定时区中特定日期的一天的开始时间的ruby Time对象。在特定时区的开始日期获取时间对象

+0

只是一个评论,因为我不知道任何有关Ruby的时区处理:午夜并不总是存在,它可能会发生两次。例如,巴西在午夜改变时钟。相反,您应该找到一天的开始。 –

+0

有趣的一点。为了我的目的,我感兴趣的一天的开始。感谢Jon。我会更新这个问题。 –

+0

你的实际用例是什么? (我发现这个问题是因为我希望得到加利福尼亚州最近的午夜,就像UTC一样,API配额跟踪。) –

回答

6

我最终使用的#local方法对ActiveSupport::TimeZone检体p分配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 

目前输出=> 2011-11-02 00:00:00 -0400

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

目前输出=> 2011-11-03 00:00:00 0800

date = Date.today 

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

目前输出=> 2011-11-02 00:00:00 0800

+1

我希望这很简单。不幸的是,不能保证你在时区转换后到达的时间是在同一天。有时它会,有时它不会取决于开始和结束区域。我想我可以将转换后的日期分量与原始值进行比较,并在必要时进行调整,但这真的很笨拙。我希望的是一种优雅的方式来实现这一点。希望api中有一些东西,我不认为这是一件想要做的事。 –

+0

我可能不完全明白你想要做什么,但'date.to_time.in_time_zone('TIMEZONE')。beginning_of_day'给你00:00:00 UTC原始指定日期。 –

+1

它不给你0 UTC,它在时区给你0,这是更可取的。但是,在使用in_time_zone转换时区之前,不会这样做,因此日期不一定有效。这里是我的意思的例子。 'date.to_time.in_time_zone('Asia/Shanghai')。midnight.in_time_zone(Time.zone).midnight#=>过去的一天。理想情况下,红宝石应该让我做这样的事情。 'date.to_time(区)'。 –

5

不知道这是否会有所帮助,但是这让我在这我的谷歌API配额重设时间:

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

我这样使用它与Mongoid,例如:

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

只要将Mongo设置为UTC,无论将代码部署到哪个时区,这都会起作用。

相关问题