在我的应用中,我有一个Person模型。 每个Person都有一个time_zone属性,用于指定其默认时区。 我也有一个Event模型。 每个Event都有一个start_timeend_time时间戳记,以UTC时间保存在Postgres数据库中。

我需要创建一个查询,该查询查找某个特定人的事件,该事件介于一天的午夜和第二天的午夜之间。 @todays_events控制器变量保存查询的结果。

我采用这种方法的部分原因是,我可能会让其他时区的人查看某个人的事件列表。 我希望他们看到的日子就像人们看到的那样,而不是基于他们作为观察者所在的时区。

无论出于何种原因,我在@todays_events.结果集中仍会收到前一天的一些事件@todays_events. 我的猜测是,我正在将UTC时间戳与非UTC参数或类似内容进行比较。 通常,只有在前一天晚上开始或结束的事件才会显示在今天的查询结果列表中。

现在,我正在设置:

@today    = Time.now.in_time_zone(@person.time_zone).midnight.to_date
@tomorrow = (@today + 1.day ).to_datetime
@today    = @today.to_datetime

我的查询看起来像:

@todays_activities = @person.marks.where("(start_time >= ? AND start_time < ?) OR (end_time >= ? AND end_time < ?);", @today, @tomorrow, @today, @tomorrow ).order("start_time DESC")

我应该如何更改此设置,以保证只能收到今天的结果(根据@todays_activities查询中的@person.time_zone @todays_activities

===============>>#1 票数:10 已采纳

当您致电to_date时,您将失去对时区的跟踪,因此请不要这样做:

@today    = Time.now.in_time_zone(@person.time_zone).midnight.utc
@tomorrow = @today + 1.day

当您some_date.to_datetime ,您将获得UTC中的DateTime实例,因此,结果如下:

Time.now.in_time_zone(@person.time_zone).midnight.to_date.to_datetime

将具有一天中的00:00:00和UTC时区; 00:00:00是@person.time_zone正确的一天中的@person.time_zone但不适用于UTC(除非@person处于+0时区中)。

您可以通过overlaps来简化查询:

where(
    '(start_time, end_time) overlaps (timestamp :today, timestamp :tomorrow)',
    :today => @today, :tomorrow => @tomorrow
)

请注意, overlaps以半开间隔运行

每个时间段都被视为代表半开间隔start <= time < end ,除非start和end相等,在这种情况下,它代表那个单个时刻。

  ask by Clay translate from so

未解决问题?本站智能推荐:

3回复

在Rails和PostgreSQL中完全忽略时区

我正在Rails和Postgres中处理日期和时间,并遇到了这个问题: 该数据库位于UTC中。 用户在Rails应用程序中设置选择的时区,但这仅在获取用户本地时间以比较时间时才使用。 用户存储时间,例如2012年3月17日晚上7点。 我不希望时区转换或时区被存储。 我只希望保存该日期和时间。
1回复

Rails 3.1时区,完全陷入困境

我有一个用户模型和一个朋友模型。.我试图跟踪用户上次与朋友联系的时间。 我有一个守护程序来收集此信息并将其保存为: 我从Twitter获得此信息,该信息以UTC报告,格式如下: 当我进入rails控制台并执行以下命令时,日期会正确地保存为带有UTC时间的UTC。 但是,当我通
1回复

Rails:不同时区的时间

旧金山上午9点,一个房间“打开”。 我必须在Rails中正确记录时间。 我想获得的时间,因为它在本地站,即: Tue, 19 Nov 2013 09:00:00 PST -08:00 。 我怎样才能做到这一点?
3回复

Rails - 用时区解析时间的更好方法?

Time.parse返回没有时区的Time对象。 我想保留时区信息。 有没有更好的方法来执行此操作,然后使用以下代码? 输入是这样的字符串,如“2012-12-25T00:00:00 + 09:00”。 此函数输出TimeWithZone对象。
2回复

Rails,Postgres和Timezone

我的表有一个名为date字段。 在进行POST以插入新行时,从客户端(浏览器)发送的日期看起来像2015-11-20T14:30:00+10:00 ,这实际上是正确的日期和时区。 但是,在Postgres内部,这个日期已插入2015-11-20 04:30:00.000000 ,正如您所
2回复

忽略Rails中的时区

我正在Rails 3.2中开发一个将在本地使用的应用程序。 例如,如果用户将事件设置为从16:00开始,则每当检索到事件时,事件应为16:00。 在Rails中进行配置的最佳方法是什么,这是个好主意吗? 似乎无论我设置什么,时间都会改变,无论是存储在数据库中还是被拉出。 我在后端
2回复

如何使用Rails在浏览器的时区中显示DateTime?

Rails将所有DateTime存储在UTC时区中。 我需要在他们的浏览器报告他们所在的时区中向用户显示该时间。有一种简单的方法吗? 使用最新的Rails(3.2.13)。
2回复

使用TimeZone将DateTime字符串转换为使用TimeZone的DateTime或使用rails 3中的UTC转换

我以下列格式从Fedex收到了DateTime字符串 我想将此字符串转换为TimeZone,例如: - 是否有任何方法可以直接将此字符串转换为utc时间? 我想要类似于以下内容
1回复

如何在具有正确时间的模型中使用before_validation过滤器覆盖datetime_select?

我有一个具有两个字段的日期和时间的表单,它们映射到一个数据库表的列时间(datetime)。 字段date是datepicker的字符串字段,而time是datetime_select。 由于我不在utc时区,因此必须在set_date方法中减去两个小时。 我该如何以更通用的方式实现呢
3回复

填充'/ edit'视图的表单字段时,Rails app config.time_zone不适用

我在我的Rails应用程序中指定了config.time_zone,但表单字段中检索到的时间仍然呈现为UTC(这会在更新时产生问题)。 这不应该转换为指定区域的当地时间吗? /config/application.rb(仅限相关行): /events/edit.html.erb(