我使用下面的java代码来获取当前的东部日期和时间,它应该以日期格式插入到数据库中。使用下面的代码,我能够按照预期的字符串格式获取东部日期和时间,但是我无法在SQL数据库中插入此字符串格式,因为要在数据库中使用的列是datetime类型。我还尝试更改格式化的东部时区日期和时间类型,但它再次以GMT格式返回日期和时间。
java.util.Date date = new java.util.Date();
java.util.Date time = new Timestamp(date.getTime());
SimpleDateFormat formatter = new SimpleDateFormat ("yyyy-MM-dd hh:mm:ss.ms");
TimeZone timeZone = TimeZone.getTimeZone("America/New_York");
formatter.setTimeZone(timeZone);
System.out.println("EST: " + formatter.format(time)); // Prints date as 2016-03-18 03:12:16.1216 which is string format
java.util.Date time1 = formatter.parse(formatter.format(time));
System.out.println("EST Time Zone: " + time1); // Prints date as Fri Mar 18 07:04:36 GMT 2016 which is date format
//Code to insert into database
dataSource = DataSourceFactoryUtil.initDataSource("net.sourceforge.jtds.jdbc.Driver",
PortletProps.get("exampledatabase.db.url"), PortletProps.get("exampledatabase.db.user"),
PortletProps.get("exampledatabase.db.password"), StringPool.BLANK);
connection = dataSource.getConnection();
stmt = connection.createStatement();
String insertQuery = "INSERT INTO [exampletable] ([Firstname], [Lastname], [address], [Time]) VALUES ('"
+ firstname + "', '" + lastname + "', '" + address + "', '" + time1 + "')";
stmt.executeUpdate(insertQuery);
在上面的代码中,第一个System.out.println在EST中打印日期,该日期与预期插入数据库中一样,但是我不能插入它,因为它是字符串类型,我得到了错误如:
从字符转换日期和/或时间时转换失败 字符串。
另一个System.out.println以日期格式给出输出,但它不在EST中。
如何以格式2016-03-18 03:12:16.1216获取输出,并以日期类型而不是字符串,以便我可以插入具有日期时间类型的数据库作为列。
答案 0 :(得分:4)
Answer by Alisson Vieira是正确的,但使用的是过时的类。
不要将字符串用于日期时间值,请使用日期时间类型。
不要使用与最早版本的Java捆绑在一起的旧日期时间类,例如java.util.Date/.Calendar。事实证明,它们设计糟糕,令人困惑且麻烦。这些类已被Java 8及更高版本中内置的java.time框架所取代。
java.time.Instant
是UTC时间轴上的一个时刻。您应该使用UTC完成大部分工作,业务逻辑和数据库存储。仅在用户或数据接收器需要时使用时区。
Instant instant = Instant.now();
最终将更新JDBC驱动程序以直接处理java.time类型。在此之前,我们必须继续依赖java.sql类型来传输数据进出数据库。但是尽量减少对这些课程的使用;在工作流程中尽快转换为java.time。
在您的数据库中,使用标准TIMESTAMP WITH TIME ZONE
类型来定义日期时间列,如果数据库不符合,则使用等效列。你几乎应该never use the without time zone
输入。
java.sql.Timestamp
类映射到java.time.Instant
类型。对于这个旧类,添加了一些新方法来转换为/来自java.time,例如toInstant
和from( Instant )
。
java.sql.Timestamp ts = java.sql.Timestamp.from( instant );
出于多种原因,您应始终使用PreparedStatement
与数据库进行交互。一个非常重要的原因是消除SQL Injection攻击的风险。
myPreparedStatement.setTimestamp( 4 , ts );
要检索使用java.sql.Timestamp
获取数据,请转换为java.time。
java.sql.Timestamp ts = myResultSet.getTimestamp( 4 );
Instant instant = ts.toInstant();
请注意,上面的代码中没有任何地方可以处理任何特定的时区。我们一直使用UTC,Java↔JDBC↔SQL↔数据库。我们没有使用Strings作为我们的日期时间值。
要查看特定时区的wall-clock time,请应用时区(ZoneId
)以获得ZonedDateTime
。使用正确的时区名称,不要使用EST
之类的3-4个字母代码,因为这些代码既不是标准化也不是唯一的。
ZoneId zoneId = ZoneId.of( "America/New_York" );
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );
要以标准ISO 8601格式查看该日期时间值的文字表示,请仅调用toString
。示例输出:2016-03-17T05:19:24.679Z
。
String output = zdt.toString();
要使用其他格式生成字符串,search Stack Overflow了解有关使用DateTimeFormatter
的许多示例。
答案 1 :(得分:2)
java.sql.Date sqlDate = new java.sql.Date(time1.getTime());
尝试在插入SQL中使用java.sql.Date
类型。
您是如何尝试插入记录的?你在用一些图书馆吗?
@Edit
System.out.print()
不像JDBC那样处理日期。第一个调用Date实例的toString()
方法,JDBC使用getTime()
,也就是Date的毫秒表示。
@ EDIT2
更改stmt = connection.createStatement();
到
PreparedStatement stmt=connection.prepareStatement("INSERT INTO exampleTable (Firstname, Lastname, address, Time) VALUES (?, ?, ?, ?)");
stmt.setString(1, firstname);
stmt.setString(2, lastname);
stmt.setString(3, address);
stmt.setTimestamp(4, new java.sql.Date(time1.getTime()));
stmt.executeUpdate();
答案 2 :(得分:1)
我可以使用以下两行代码获取EST日期时间格式的日期和时间:
TimeZone.setDefault(TimeZone.getTimeZone("America/New_York"));
Timestamp timestamp = new Timestamp(new Date().getTime());
我得到的输出为EST日期和时间:2016-03-23 03:12:16.1216
这是工作代码,包括我在提问时提供的代码:
TimeZone.setDefault(TimeZone.getTimeZone("America/New_York"));
Timestamp timestamp = new Timestamp(new Date().getTime());
//Code to insert into database
dataSource = DataSourceFactoryUtil.initDataSource("net.sourceforge.jtds.jdbc.Driver",
PortletProps.get("exampledatabase.db.url"), PortletProps.get("exampledatabase.db.user"),
PortletProps.get("exampledatabase.db.password"), StringPool.BLANK);
connection = dataSource.getConnection();
stmt = connection.createStatement();
String insertQuery = "INSERT INTO [exampletable] ([Firstname], [Lastname], [address], [Time]) VALUES ('"
+ firstname + "', '" + lastname + "', '" + address + "', '" + timestamp + "')";
stmt.executeUpdate(insertQuery);