Ruby Datetime解析

3

我希望能够按日期比较行。首先,我保存了类似于这样的字符串日期数据:

2/10/15 23:37 

将数据导入我的PostgreSQL数据库。

我可以看到我的日期已保存,现在的日期格式为:2015-02-10 23:37:00,而区域设置字段设置为lc_collate = en_US.UTF-8

现在我正在使用相同的文件,并想比较日期字段,以查看它是否相同(应该是相同的!),但Ruby将2/10/15 23:37读作0002-10-15 13:01:00 +0800

我也尝试了这个:

Date.strptime(myDate, "%m/%d/%Y")

但结果是0015-02-12

我怎样才能让Ruby以与我的数据库相同的方式读取我的输入字符串?我试图在我的application.rb中设置config.i18n.default_locale = 'en-US',但没有帮助。


日期解析是我知道的“最容易出错”的事情之一。在美国,日期通常采用MM/DD/YY(YY)格式,但其他国家使用DD/MM/YY(YY)。你必须非常小心,不要解析日期,除非你非常确定它来自哪里。如果实际上是将日值解析为月份并且大于12,则月份可能超出范围,导致异常。当日值在月份范围内时,但是日和月被调换时,情况会更糟。也没有办法防止这个问题,你必须了解数据。 - the Tin Man
2个回答

4

如果您提供的是两位数的年份,应该是:

Date.strptime(myDate, "%m/%d/%y") # Note the lower case y

如果时间也很重要,您应该使用:
DateTime.strptime(myDate, "%m/%d/%y %H:%M")

1
那真的非常有帮助!毕竟我使用了DateTime.strptime(myDate, "%m/%d/%y %H:%M").to_s(:db)),我的输出是正确的。谢谢! - Krzysztof Witczak

3
你可以这样做:
starting_time = Time.now - 1.hour
starting_time.to_s(:db)

这将使我示例中的 starting_time 与数据库 DATETIME 字段中的匹配。


我现在遇到了这个错误:"参数错误(0个参数,应该是1个)"。我认为这可能与我的starting_time已经是字符串类型有关。所以为了快速获得答案,我尝试了starting_time.to_time.to_s(:db),但是我收到的响应是0002-11-15 12:54:00。 - Krzysztof Witczak
使用 Time.now 我得到了正确的输出 - 2015年05月11日21:05:19 +0800。 - Krzysztof Witczak
3
所以终究还是to_s(:db)有用...+1 - Mischa
很高兴能够帮助。 :) - David Hoelzer

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