我试图使用java.util.Date输入,然后用它创建一个查询 - 所以我需要一个java.sql.Date.
我很惊讶地发现它无法隐式或显式地进行转换 - 但我甚至不知道如何做到这一点,因为Java API对我来说仍然是一个新手.
我正在开发一个Java App,我有一个timeStamp(in long).我可以轻松地使用此代码将其更改为公历日期:
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(timeStamp);
Run Code Online (Sandbox Code Playgroud)
但我需要在Jalali日历中有日期.我搜索但没有找到任何好的图书馆.你知道一个可靠而好的库来转换(或用Jalali格式创建日期timeStamp)吗?我不需要实现或算法,因为这个问题太麻烦并且有很多规则,我需要一个可靠的解决方案
我在PostgreSQL数据库中存储了两个日期.首先,是网页的访问数据,第二个日期是网页的最后修改日期(这是长的).
我怀疑存储这些值的最佳策略是什么.
我只需要日/月/年和小时:秒,这只适用于统计建议.
所以有些疑惑:
我对SQL DATE数据类型的行为感到有些困惑java.sql.Date.以下语句为例:
select cast(? as date) -- in most databases
select cast(? as date) from dual -- in Oracle
Run Code Online (Sandbox Code Playgroud)
让我们用Java准备并执行该语句
PreparedStatement stmt = connection.prepareStatement(sql);
stmt.setDate(1, new java.sql.Date(0)); // GMT 1970-01-01 00:00:00
ResultSet rs = stmt.executeQuery();
rs.next();
// I live in Zurich, which is CET, not GMT. So the following prints -3600000,
// which is CET 1970-01-01 00:00:00
// ... or GMT 1969-12-31 23:00:00
System.out.println(rs.getDate(1).getTime());
Run Code Online (Sandbox Code Playgroud)
换句话说,我绑定到语句的GMT时间戳成为我回来的CET时间戳.添加时区的步骤是什么?为什么?
注意:
我已经观察到这对于任何这些数据库都是如此:
DB2,Derby,H2,HSQLDB,Ingres,MySQL,Oracle,Postgres,SQL Server,Sybase ASE,Sybase SQL Anywhere
DATE数据类型)java.sql.Timestamp而不是使用时,所有这些都是无关紧要的 …我在数据库上保存日期时遇到了一种非常奇怪的行为.在我的(Linux centOS 6.2)服务器上,我使用glassfish应用服务器(3.1.1 - build 12)和Java(1.7.0_09),该应用程序是用Java + GWT开发的,它使用PostgreSQL服务器(9.2.1).在应用程序内部,有几个日期字段保存在数据库中.日期字段使用datepicker(http://code.google.com/p/gwt-datepicker,r30).
db关系的date属性是日期类型(不是时间戳).有些日期在前一天保存在数据库中.问题只发生在间隔之间的日期,例如在19.03.1968和1910年10月27日之间,这让我想到了某种夏季时间问题.但是,由于1969年没有发生这种情况,我无法很好地孤立这个问题.我正在尝试找到问题发生的其他日期间隔.例如,如果我在应用程序中选择19.05.1968,则在保存到数据库中后,日期将保存为18.05.1968.
奇怪的是,我在另一台服务器上有相同应用程序的另一个等级,并且在相同日期它们被正确保存.这让我觉得问题可能依赖于:
我尝试将服务器的每个配置设置为欧洲/罗马(我的时区),但没有.任何的想法?我怎么能解决或调查这个问题?
更新: 1968年是闰年.这个问题也发生在1972年,这也是闰年.总结:在夏季时间间隔期间,闰年发生了"日期保存一天前"问题.
创建日期对象的代码部分是:
Date d = dateField.getSelectedDate();
if (d != null) {
txtVal = DateTimeFormat.getFormat("dd/MM/yyyy").format(d);
}
Run Code Online (Sandbox Code Playgroud)
其中dateField声明为:
transient private DatePicker dateField;
Run Code Online (Sandbox Code Playgroud)
包是org.zenika.widget.client.datePicker.DatePicker(之前提到的gwt-datepicker-r30),而DateTimeFormat是指com.google.gwt.i18n.shared.DateTimeFormat
接受答案后更新:
我使用了这个解决方法:当我创建日期时,我使用以下代码:
final long hours12 = 12L * 60L * 60L * 1000L;
Date d = new Date(d1.getTime() + hours12);
Run Code Online (Sandbox Code Playgroud) 可能重复:
Java 7日期/时间API
我已经读过有关Joda Time将被包含在Java 7中的传言,但我无法找到这些信息的权威来源.将Joda Time包含在未来的JDK中吗?请引用你的消息来源.
当我将SQL插入DateTime数据库时,我得到了2007-02-07 12:00:00.00
但我做了Date这样的对象:2007-02-07 17:29:46.00
如何获取数据库中秒的值.它总是把它改回来12:00:00.00
date.setYear(Integer.valueOf(parsedDate[2].replaceAll(" ", "")) - 1900);
date.setMonth(Integer.valueOf(parsedDate[0].replaceAll(" ", "")));
date.setDate(Integer.valueOf(parsedDate[1].replaceAll(" ", "")));
...
java.sql.Date sqlDate = new java.sql.Date(date.getTime());
Run Code Online (Sandbox Code Playgroud)
我应该使用任何格式化程序吗?
这是一个简单的问题:我知道并且几乎每个人都听说java.util.Date在Jdbc调用中使用任何东西都是个坏主意.你应该使用java.sql.Date或者java.sql.Time或java.sql.Timestamp.但是,有什么理由不去?我找不到一篇好的博客文章或SO帖子解释它,除了有时人们看到"奇怪的行为".
谢谢!
编辑:
所以,我看过这篇文章.是的,那篇文章的唯一部分是我的问题的答案
...对于大多数JDBC驱动程序来说,它们会愉快地吞噬它,就像它的类型正确一样,但是当你事后请求数据时,你可能会注意到你实际上缺少了东西.
但是,这并没有真正回答原因.
我有一个Map<Date, Foo>,以及一个带有effectiveDate属性的数据库对象列表,我想检查一下Date我的地图中的键是否effectiveDate与数据库中的任何一个相同- 如果是这样的话,那么就做Foo.
代码看起来像这样:
for (Bar bar : databaseBars) {
Foo foo = new Foo();
if (dateMap.containsKey(bar.getEffectiveDate()) {
foo = dateMap.get(bar.getEffectiveDate());
}
// do stuff with foo and bar
}
Run Code Online (Sandbox Code Playgroud)
然而,dateMap.containsKey即使我确定它有时存在,但是调用总是返回false.
作为一个完整性检查,我打印出了日期的长值,以及equals()通话和compareTo()通话的结果:
for (Date keyDate : dateMap.keySet()) {
if (keyDate == null) {
continue; // make things simpler for now
}
Date effDate = bar.getEffectiveDate();
String template = "keyDate: %d; effDate: %d; …Run Code Online (Sandbox Code Playgroud) 我有一个类,其日期字段表示一段数据的"有效起始日期".它的定义如下:
@Temporal( TemporalType.DATE )
private Date validFrom;
Run Code Online (Sandbox Code Playgroud)
在我从数据库中提取日期并显示它之前,似乎一切正常.如果我在前端选择2003年9月18日的日期,那么当我在数据库中检查确定的日期是保存的日期时保存它(数据库是MySQL 5.5.9列类型是DATE).然而,当我拿出一份清单时,显示的日期是2003年9月17日 - 前一天.
如果我选择在2003年3月26日或2003年12月25日之前或之后的一个日期,一切都很好,所以我猜这是与夏令时有关但错误在哪里蔓延?由于数据库似乎保持正确的日期,我猜测它必须在JPA转换回java.util.Date时 - java.util.Date是用于日期的最佳类吗?我已经看过一些人们使用Calendar的例子,但这看起来非常重,我不确定它能用于基于JSF的前端.