如何在MongoMapper和Ruby/Rails中将日期转换为UTC?

3
我添加了这行代码。
self.auth_history.push [start_date, self.coupon_code]

然后收到了这个错误信息

Date is not currently supported; use a UTC Time instance instead.

我也尝试了 start_date.utc,但也没有用。

请帮忙。谢谢。


尝试使用 Time.new(start_date),start_date是从哪里来的?它是一个方法吗? - andrea
我放弃将 start_date 从 Date 转换为 UTC 时间。我打算通过使用 start_date.to_s 将 start_date (一个 Date) 存储为字符串。 - Mei
4个回答

8
我从西雅图旅团小组得到了这个答案:
===
我没有在您的代码中看到start_date作为MongoMapper中的键定义,因此我假设您是通过Ruby直接创建自己的日期对象或被Rails包装。据我所知,Mongo将日期存储为自纪元以来毫秒数的UTC时间。因此,当您在MongoMapper中使用:date映射定义键时,您正在将一个Ruby中的Time对象进行包装。
因此,如果您想要在Mongo内部存储日期,并且它不是由MongoMapper创建的,请确保在UTC中创建Time对象。MongoMapper带有一个名为to_mongo的日期混合方法,您可以使用该方法。
>> Time.now.utc
=> Fri Jan 28 03:47:50 UTC 2011
>> require 'date'
=> true
>> date = Date.today
=> #<Date: 4911179/2,0,2299161>
>> Time.utc(date.year, date.month, date.day)
=> Thu Jan 27 00:00:00 UTC 2011
>> require 'rubygems'
=> true
>> require 'mongo_mapper'
=> true
>> Date.to_mongo(date)
=> Thu Jan 27 00:00:00 UTC 2011

但要注意时间变化。
>> Date.to_mongo(Time.now)
=> Thu Jan 27 00:00:00 UTC 2011
>> Date.to_mongo(Time.now.utc)
=> Fri Jan 28 00:00:00 UTC 2011

Good luck.

===

And by using

Date.to_mongo(start_date) 

这对我来说是有效的。


0
首先,我认为问题标题的描述不够准确。实际上,不同时区之间的差异在于时间而非日期。因此,说要将日期转换为UTC格式并不恰当。
以下是Ruby中另一种将DateTime转换为其UTC格式的方法:
DateTime.now.new_offset(0)

-1

这里还有另一个选项:

Time.at(Date.today.to_datetime.to_i).utc

这里我以Date.today作为一个任意的例子日期。用你想要转换的日期替换它。一旦日期被转换成了Time实例,它就可以被序列化为BSON而没有任何问题,因为Time是一个受支持的原始类型,也就是说,它可以使用MongoMapper保存到数据库中。


这并没有提供问题的答案。如果您想对作者进行批评或请求澄清,请在他们的帖子下留言。 - Kousik
我撤销了对我的答案的编辑,因为它完全改变了我的代码(即,编辑导致代码返回DateTime而不是Time实例)。我还添加了一个关于这个纯Ruby解决方案与MongoMapper相关性的解释。 - Kevin Bullaughey

-2
根据EfratBlaier的评论,我已经更新了答案。

Date.today.to_time.utc


该方法是to_datetime,而不是to_date_time。 - Ben Fulton
1
这可能是错误的,因为通常您希望使用UTC日期。这将首先将其转换为当地时间午夜,然后将该时间转换为UTC。 - Amala

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接