我正在使用 Sinatra 编写一个将由 Android 应用程序使用的 Web 服务。Microsoft SQL Server 中使用的数据库。
存储过程调用是在 Ruby 中进行的:
sql = "exec GetTraces '#{id}', '#{start_date}', '#{end_date}'"
result = ConnectionManager.connection.select_all(sql)
GetTraces 存储过程返回一个包含日期时间对象的列。当服务器和客户端存在于同一时区时,将返回正确的结果。当服务器和客户端在不同的时区时,返回不正确的结果。
例如,如果我使用 2013-10-16T06:1500Z 作为开始日期,使用 2013-10-16T09:1500Z 作为结束日期,那么我应该得到该范围内的日期时间。当客户端和服务器位于不同的时区时,我得到以下信息:
2013-04-09T00:03:11+00:00
我手动测试了存储过程,它返回了正确的结果。Ruby 中显示的结果不是存储过程返回的结果。Activerecord 和/或 Tiny tds 似乎正在错误地解析日期时间。
以下是手动执行存储过程时返回的日期时间示例:
2013-10-16 09:10:51.553
我已经用以下内容覆盖了 ActiveRecord,以解决以前从 SQL Server 解析日期时间的问题。我在网上找到了这个解决方案。
module ActiveRecord
module ConnectionAdapters
class ColumnWithIdentity
def cast_to_time(value)
return value if value.is_a?(Time) or value.is_a?(DateTime)
time_array = ParseDate.parsedate(value)
time_array[0] ||= 2000
time_array[1] ||= 1
time_array[2] ||= 1
Time.send(Base.default_timezone, *time_array) rescue DateTime.new(*time_array[0..5]) rescue nil
end
def cast_to_datetime(value)
if value.is_a?(Time) or value.is_a?(DateTime)
if value.year != 0 and value.month != 0 and value.day != 0
return value
else
return Time.mktime(2000, 1, 1, value.hour, value.min, value.sec) rescue nil
end
end
return cast_to_time(value) if value.is_a?(Date) or value.is_a?(String) rescue nil
value
end
end
end
end
对此问题的任何见解表示赞赏。谢谢!