用于将东部日期和时间作为日期格式插入数据库的Java代码

时间:2016-03-18 19:34:11

标签: java

我使用下面的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获取输出,并以日期类型而不是字符串,以便我可以插入具有日期时间类型的数据库作为列。

3 个答案:

答案 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,例如toInstantfrom( 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);