gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 07:21:24 25 4
gpt4 key购买 nike

我正在使用如下所示的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 中的日期,该日期按预期插入到数据库中,但我无法插入它,因为它是字符串类型,并且出现错误: :

Conversion failed when converting date and/or time from character string.

另一个 System.out.println 以日期格式提供输出,但它不是 EST 格式。

如何获得格式为 2016-03-18 03:12:16.1216 的输出,并采用日期类型而不是字符串,以便我可以插入到将日期时间类型作为列的数据库中。

最佳答案

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 ↔ 数据库。我们没有在任何地方使用字符串作为日期时间值。

查看 wall-clock time对于特定时区,应用时区 ( ZoneId ) 来获取 ZonedDateTime 。使用正确的时区名称,切勿使用 3-4 个字母的代码,例如 EST,因为它们既不是标准化的也不是唯一的。

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 的许多示例.

关于用于获取东部日期和时间作为日期格式插入数据库的Java代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36092860/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com