我正在尝试将日期插入我的PostgreSQL数据库。以下是我在java应用程序中解析日期的方式:
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");
Date parsedTimeStamp = dateFormat.parse(dateString);
在我的PostgreSQL数据库中。我将其作为带有时区的时间戳
。处理和插入它的理想方式是什么?
数据库期望2017-09-09 07:15:33.451061 00
的示例。
从我在Postgres文档中看到的JDBC映射类型来看,Postgres需要java。sql。时间戳,用于映射到时区类型的时间戳。如果您使用的是准备好的语句,可以使用:
java.sql.Timestamp ts = new Timestamp(parsedTimeStamp.getTime());
PreparedStatement stmt;
// define the statement using Postgres SQL with placeholders
Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
// now set the timestamp at the particular timezone in the statement
stmt.setTimestamp(index, ts, cal);
用实际需要的时区替换GMT,并用占位符的数字索引替换索引,占位符的时间戳应出现在实际SQL中。
请注意,除了Java之外,与Java 8兼容的较新驱动程序还应支持使用LocalDateTime。sql。时间戳。
您在此处使用的SimpleDateFormat将字符串转换为日期,在您的示例中,这必须意味着您使用的格式id“yyyyMMdd”-例如20171217(今天)。
要为数据库创建字符串,您需要采取相反的方法。从日期对象到字符串。
您可以为此创建自己的格式化程序(使用您的示例)
Date date = new Date();
DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH-mm-ss.SSSSSSX");
String text = formatter.format(date);
您可以在此处阅读有关格式的更多信息
myPreparedStatement.setObject(
… ,
LocalDate.parse( "20170909" , DateTimeFormatter.BASIC_ISO_DATE ) // Parse string into a date-only object, a `LocalDate` object.
.atStartOfDay( ZoneId.of( "Asia/Kolkata" ) ) // Apply a time zone to determine the first moment of the day on that date, producing a `ZonedDateTime` object.
.toInstant() // Extract an `Instant` object, a moment always in UTC. This last step is not technically required, as your JDBC driver with Postgres should effectively do this on your behalf. But this line completes the demo conceptually.
) ;
其他答案已经过时,使用的是现在遗留的、被java取代的麻烦的旧日期时间类。时间类。
使用支持JDBC 4.2及更高版本的JDBC驱动程序,您可以交换java。Postgres服务器的时间对象。不需要java。sql日期时间类,也不是可怕的日期类和日历类。
持续性:
Instant instant = Instant.now() ;
myPreparedStatement.setObject( … , instant ) ;
…并检索:
Instant instant = myResultSet( … , Instant.class ) ;
在标准SQL中,带有时区的时间戳是一个时刻,是时间线上的一个特定点。换句话说,是一个日期、一天中的时间和一个时区。相比之下,您只有一个日期,缺少一天中的时间和时区。您可能希望在特定时区中使用该特定日期的一天的第一个时刻。
要将仅日期值更改为一个时刻,请首先创建一个LocalDate对象。
LocalDate ld = LocalDate.parse( "20170909" , DateTimeFormatter.BASIC_ISO_DATE ) ;
接下来,在传递分区ID时调用该对象的atStartOfDay方法。
需要时区来赋予日期以含义。对于任何给定的时刻,全球各地的日期因地区而异。例如,法国巴黎午夜后几分钟是新的一天,而魁北克山仍然是“昨天”。
以大陆/地区
的格式指定适当的时区名称,例如America/蒙特利尔
、Africa/Casablanca
或Pacific/Auckland
。永远不要使用3-4个字母的缩写,例如EST
或IST
,因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。
ZoneId z = ZoneId.of( "America/Montreal" ) ;
ZonedDateTime zdt = ld.atStartOfDay( z ) ;
最后提取一个瞬间。
Instant instant = zdt.toInstant() ;
此时,您可以像上面所讨论的那样,将即时消息插入数据库。
如果您在与来自Java的数据库交换数据时学会从对象而不是单纯的字符串的角度思考,您的工作会更容易。
顺便说一下,要清楚Postgres如何使用数据类型TIMESTAMP AND TIME ZONE
。SQL标准对这种数据类型的定义非常简单,数据库的实现也各不相同。下面描述了Postgres版本8、9和10的行为。
任何与时区或UTC偏移一起提交的日期时间值都将通过使用该时区/偏移来确定UTC值来处理。然后,该UTC值以微秒(而不是传统JavaJava.util.Date
检索时,日期时间值以UTC从Postgres发送。psql或pgAdmin等介入工具可能会混淆地应用默认时区。虽然这一特性的用意很好,但它会造成存储值带有时区的假象,而实际上它并没有。相反,符合JDBC 4.2及更高版本的JDBC驱动程序将自动为您处理UTC和区域。通常,我建议总是检索一个即时对象,如上面的代码所示。然后,如果需要,应用区域来实例化您自己的ZonedDateTime或OffsetDateTime对象,如上面的代码所示。
java.time框架内置在Java8及更高版本中。这些类取代了麻烦的旧的遗留日期-时间类,例如java.util.Date
,Calendar
,
现在处于维护模式的Joda-Time项目建议迁移到java.time类。
要了解更多信息,请参阅Oracle教程。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310。
从何处获取java。时间课程?
ThreeTen额外项目扩展了java。额外上课的时间。该项目是java未来可能添加内容的试验场。时间您可以在这里找到一些有用的类,如Interval
、YearWeek
、YearQuarter
等。
我正在尝试转换java。util。日期至java。时间本地日期: 但是,当有例如22:25的一天时间时,我选择ZoneId,例如:。 即将推出的本地日期将有不同的日期(因为该区域增加了6小时),例如欧洲/明斯克: 我想在结果的LocalDate中保留与该实例相同的日期。一些方法如何解决这个问题?我想可能有几种方法。
我有一个日期时间,格式为2019年4月30日星期二16:00:00 0800,这是RFC 2822格式的日期 我需要将其转换为日期时间0800中的给定时区 如果我总结一下, 如何在Java中实现这一点?我已经尝试了下面的代码,但它给出的时间比当前时间短08小时,即
问题内容: 我想将此GMT时间戳转换为GMT + 13: 我已经尝试过约100种不同的DateFormat,TimeZone,Date,GregorianCalendar等组合,以尝试执行此非常基本的任务。 这段代码可以满足我在当前时间的需求: 但是我想要的是设置时间而不是使用当前时间。 我发现任何时候我都尝试这样设置时间: 使用本地计算机的TimeZone。这是为什么?我知道,当“ new Da
返回我女巫是错误的。 但接下来的查询如下: 我看对日期
问题内容: 如何将Unix时间戳中的时间转换为正常时间? 问题答案: 您的问题含糊不清。我将消除时区的歧义。 如何将Unix时间戳中的时间转换为正常时间? 我怀疑您是以某种方式从数据库而不是从中获取或一个值。在JDBC中,通常希望使用适当的方法来获取特定于DB的数据类型。可以获取MySQL 数据类型,从而为您提供,而后者又是的子类。 简而言之,应该执行以下操作: 要将其呈现给最终用户时,要以人类可
这是我在申请表中得到的日期: 将psqlDate转换为joda的最佳方式是什么? [编辑] 我可以使用解析方法。它可以很好地使用时间戳,它可以使用T-分割日期和时间的信息。 这应该与良好的模式一起工作: 带有时区的PostgreSQL时间戳的正确模式是什么?