我有以下字符串格式的时间戳
2019-04-06T00:43:21+00:00
2019-04-04T21:24:33+00:00
2019-04-04T21:02:16+00:00
如何将上面的时间戳字符串解析为Java.sql.timestamp
?
Timestamp // Avoid this terrible legacy class if possible. Represents a moment in UTC.
.from( // Convert from modern `Instant` to legacy `Timestamp`. No data loss, as both resolve to nanoseconds.
OffsetDateTime // Modern way to represent a moment with an offset-from-UTC (hours, minutes, and seconds).
.parse( "2019-04-06T00:43:21+00:00" ) // Parse standard ISO 8601 strings. Returns a `java.time.OffsetDateTime` object.
.toInstant() // Extract an `Instant` from the `OffsetDateTime`, thereby adjusting to UTC (an offset of zero).
) // Returns a `Timestamp` object, if needed to interoperate with old code not yet updated to *java.time*.
更好的是,完全跳过可怕的Timestamp
类。
myPreparedStatement.setObject( // As of JDBC 4.2 and later, exchange *java.time* objects with your database.
1 , // Specify the nth placeholder in your SQL statement.
OffsetDateTime.parse( "2019-04-06T00:43:21+00:00" ) // Parse an ISO 8601 compliant string as a `OffsetDateTime` object, a moment with an offset-from-UTC. Pass to the database via the `setObject` call.
)
您的输入字符串指示UTC偏移量(小时-分钟-秒),该部分位于末尾。
您的输入字符串是标准的ISO 8601格式。java.time类在解析/生成字符串时默认使用这些格式。因此不需要指定格式化模式。
OffsetDateTime odt = OffsetDateTime.parse( "2019-04-06T00:43:21+00:00" ) ;
永远不要使用java。util。时间戳
。这个可怕的类在几年前被现代java所取代。时间课。
如果必须有时间戳
对象才能与尚未更新为java的旧代码进行互操作。时间,通过调用添加到旧类中的新方法进行转换。从OffsetDateTime
中提取一个即时
(从而将UTC本身的任何偏移量调整为零的偏移量)。将即时
对象传递给时间戳。从
。
java.sql.Timestamp ts = Timestamp.from( odt.toInstant() ) ;
从JDBC 4.2开始,我们可以交换java。数据库中的时间对象。
myPreparedStatement.setObject( … , odt ) ;
检索
OffsetDateTime odt = myResultSet.getObject( … , OffsetDateTime.class ) ;
所有这些已经在堆栈溢出上被多次讨论过。所以搜索更多信息。今后,在发帖前要彻底搜索。
爪哇。时间框架内置于Java8及更高版本中。这些类取代了麻烦的旧遗留日期时间类,比如java。util。日期
,日历
,
要了解更多信息,请参阅Oracle教程。并搜索堆栈溢出以获得许多示例和解释。规格是JSR 310。
现在处于维护模式的Joda-Time项目建议迁移到java.time类。
你可以交换java。时间对象直接与数据库连接。使用符合JDBC 4.2或更高版本的JDBC驱动程序。不需要字符串,也不需要java。sql*
类。
在哪里获得java.time类?
JavaSE 8,JavaSE 9,JavaSE 10,JavaSE 11,以及更高版本-标准JavaAPI的一部分,具有捆绑实现。
- Java9增加了一些小功能和修复。
- 大部分的java应用程序。时间功能被重新移植到Java 6
- 更高版本的Android捆绑包实现了java。时间课
- 对于早期的Android系统(
额外的Three Ten项目扩展了java。有额外课程的时间。这个项目是java未来可能增加的一个试验场。时间你可以在这里找到一些有用的类,比如Interval
,YearWeek
,YearQuarter
,等等。
使用DateFormat解析字符串。
try{
String x="2019-04-04T21:24:33+00:00";
DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'hh:mm:ssX");
Date date = (Date) df.parse(x);
java.sql.Timestamp timeStamp = new java.sql.Timestamp(date.getTime());
}catch(ParseException pe){
pe.printStackTrace();
}
正如其他人在评论中提到的,有一种更更新的方法可以做到这一点。
String time="2019-04-04T21:02:16+00:00";
OffsetDateTime odt=OffsetDateTime.parse(time,DateTimeFormatter.ISO_OFFSET_DATE_TIME);
java.sql.Timestamp timestamp=new java.sql.Timestamp(odt.toEpochSecond()*1000);
在我的数据集中,我有一个变量< code>duration,其中有200万行< code>ISO 8601格式的数据。示例格式:< code>PT21S或< code>PT5M29S,< code>PT1M16S 我在将此字符串变量转换为时间时遇到问题。目前我正在使用查询: 通过该查询,可以区分持续时间是小时、分钟还是秒。我想将字符串持续时间转换为时间。我用过Regex和cast,但没有成功。当我
我有一个字符串时间格式。我没有找到任何格式来解析这个字符串值。有没有办法将这个字符串值转换为Gotime.Time? 编辑 - 这不是重复的问题。我知道如何解析,但我不知道我们可以使用时间格式包中列出的任何布局。这个答案清除了我的涂鸦。
基本上我有一个领域
我有以下值:2018-01-16-18.56.57.300000 它被传递给方法参数:“value”。 我得到了一个Timestamp对象,其值为2018-01-16 19:01:57.0,与原始字符串值相比多了大约5分钟。 为什么会出现这种情况,我如何纠正我的转换?
如何将字符串日期格式转换为日期,我有格式为以下格式的日期字符串: 接下来,我尝试了,但没有运气。 所有上述语句都存在解析错误。
我有一个格式有时间戳的字符串 “2021-02-04 23:45:00”但是当我尝试用time.parse解析它时,它似乎切断了年份部分。 代码是 其中此时的record[i]是一个字符串 2021-02-04 00:15:00 和阅读。间隔就是时间。时间 Printf中返回的错误是 我在我做过的任何搜索中都找不到。我在这里错过了什么?