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

获取东部日期和时间作为日期格式插入数据库的Java代码,java,Java,我使用下面的java代码来获取当前的东部日期和时间,它应该以日期格式插入到数据库中。使用下面的代码,我能够按预期以字符串格式获取东部日期和时间,但我无法在SQL数据库中插入此字符串格式,因为数据库中要存储的列的类型为datetime。我还尝试更改格式化的东部时区日期和时间到日期类型,但它再次以GMT格式返回日期和时间 java.util.Date date = new java.util.Date(); java.util.Date time = new Timestamp(date.getTi

我使用下面的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、日期类型而不是字符串的输出,以便我可以插入到以datetime类型作为列的数据库中

java.sql.Date sqlDate = new java.sql.Date(time1.getTime());
尝试在insert sql中使用
java.sql.Date
类型

您如何尝试插入记录?你在用图书馆吗

@编辑

System.out.print()
不像JDBC那样处理日期。第一个调用日期实例的
toString()
方法,JDBC使用
getTime()
,也就是日期的毫秒表示形式

@编辑2

更改
stmt=connection.createStatement()

正确,但使用过时的类

不要对日期时间值使用字符串,请使用日期时间类型

不要使用与最早版本的Java捆绑在一起的旧日期时间类,例如Java.util.date/.Calendar。事实证明,它们设计拙劣、令人困惑且麻烦。这些类已经被内置在Java8和更高版本中的java.time框架所取代

A
java.time.Instant
是UTC时间线上的一个时刻。您应该在UTC中完成大部分工作、业务逻辑和数据库存储。仅当用户或数据接收器需要时才使用时区

Instant instant = Instant.now();
最终,JDBC驱动程序将被更新,以直接处理java.time类型。在此之前,我们必须继续依赖java.sql类型来将数据传入/传出数据库。但是尽量减少使用这些类;在工作流程中尽快转换为java.time

在数据库中,使用标准类型定义日期时间列,如果数据库不兼容,则使用等效类型。你应该打字

java.sql.Timestamp
类映射到
java.time.Instant
类型。对于这个旧类,添加了一些新方法,用于与java.time进行转换,例如和

出于多种原因,您应该始终使用与数据库交互。一个非常重要的原因是消除攻击的风险

要检索,请使用
java.sql.Timestamp
获取数据,然后转换为java.time

java.sql.Timestamp ts = myResultSet.getTimestamp( 4 );
Instant instant = ts.toInstant();
请注意,在上面的代码中,我们没有处理任何特定的时区。我们一直在使用Java↔ JDBC↔ SQL↔ 数据库我们没有在日期时间值中使用字符串

若要查看特定时区的,请应用时区()以获取。使用正确的时区名称,切勿使用3-4个字母的代码,如
EST
,因为这些代码既不标准也不唯一

ZoneId zoneId = ZoneId.of( "America/New_York" );
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );
要以标准格式查看该日期时间值的文本表示,只需调用
toString
。输出示例:
2016-03-17T05:19:24.679Z

String output = zdt.toString();

要生成其他格式的字符串,有关使用的许多示例。

我可以使用以下两行代码以EST datetime格式获取日期和时间:

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);

Java
日期
仅存储自纪元(1970年1月1日UTC午夜)起的毫秒数。因此,它将始终显示为GMT(无格式)。请包括您用于插入的代码。正如@alisson vieira所说,你需要使用日期而不是字符串来进行插入。我已经更新了我的代码,以显示我是如何进行插入的。请参阅上面编辑的代码。我已使用上面编辑的代码中插入数据库的代码进行了更新。
String output = zdt.toString();
TimeZone.setDefault(TimeZone.getTimeZone("America/New_York"));
Timestamp timestamp = new Timestamp(new Date().getTime());
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);