我正在处理Rails和Postgres中的日期和时间并遇到这个问题:
数据库采用UTC格式.
用户在Rails应用程序中设置选择的时区,但仅在获取用户本地时间来比较时间时使用.
用户存储时间,例如2012年3月17日晚上7点.我不希望存储时区转换或时区.我只想保存日期和时间.这样,如果用户改变他们的时区,它仍将显示2012年3月17日,晚上7点.
我只使用用户指定的时区来获取用户本地时区当前时间之前或之后的记录.
我目前正在使用"没有时区的时间戳",但是当我检索记录时,rails(?)会将它们转换为应用程序中的时区,这是我不想要的.
Appointment.first.time
=> Fri, 02 Mar 2012 19:00:00 UTC +00:00
Run Code Online (Sandbox Code Playgroud)
因为数据库中的记录似乎是以UTC形式出现的,我的黑客是用当前时间,用'Date.strptime(str,"%m /%d /%Y")删除时区,然后做我的查询:
.where("time >= ?", date_start)
Run Code Online (Sandbox Code Playgroud)
似乎必须有一种更简单的方法来忽略周围的时区.有任何想法吗?
我在mysql中有一个查询,比较这样的2个日期
convert_tz(updatedDate,'+05:30','-05:00') < ?
Run Code Online (Sandbox Code Playgroud)
convert函数返回美国时间中createddate列的值.当我在mysql查询浏览器中运行此查询时
convert_tz(updatedDate,'+05:30','-05:00') < '2013-04-14 09:30:00'
Run Code Online (Sandbox Code Playgroud)
例如,它给了我正确的值
product count
------- ------
A 123
B 7
Run Code Online (Sandbox Code Playgroud)
现在,我正在使用像这样的PreparedStatement在java中设置它
pst.setTimestamp(1, new java.sql.Timestamp(end.getTimeInMillis()));
rs=pst.executeQuery();
System.out.println("=====new Open Tickets Query executed=====");
System.out.println(pst);
Run Code Online (Sandbox Code Playgroud)
最后一行打印整个查询,值集是
convert_tz(updatedDate,'+05:30','-05:00') < '2013-04-14 09:30:00'
Run Code Online (Sandbox Code Playgroud)
但它给了我不同的价值观
product count
------- ------
A 155
B 19
Run Code Online (Sandbox Code Playgroud)
所以,我怀疑是我将代码更改为TimeZone问题
end.setTimeZone(TimeZone.getTimeZone("America/New York"));
pst.setTimestamp(1, new java.sql.Timestamp(end.getTimeInMillis()));
rs=pst.executeQuery();
System.out.println("=====new Open Tickets Query executed=====");
System.out.println(pst);
Run Code Online (Sandbox Code Playgroud)
但它仍然给出了同样错误的结果.
更多信息:我如何设置日历结束变量
我有一个Web应用程序,它给我日期字符串"2013-04-14 09:30:00"
DateFormat df1=new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
Calendar end=Calendar.getInstance();
end.setTime(df1.parse(endString));
end.set(Calendar.HOUR, 9);
end.set(Calendar.MINUTE, 30);
end.set(Calendar.SECOND, 0);
Run Code Online (Sandbox Code Playgroud)
另外,对于实验我尝试使用java.util.Date对象,它给我正确的结果以下是代码
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
end.setTime(sdf.parse("2012-10-01 00:00:00")); …Run Code Online (Sandbox Code Playgroud) 在PostgreSQL,数据类型timestamp和timestamp with timezone都使用8个字节.
我的问题是:
timestamp with timezone
类型中,以及在读取类型时如何解析?