当前位置: 首页 > 知识库问答 >
问题:

解析时间戳字符串到Java.sql.timestamp[重复]

拓拔阎宝
2023-03-14

我有以下字符串格式的时间戳

2019-04-06T00:43:21+00:00
2019-04-04T21:24:33+00:00
2019-04-04T21:02:16+00:00

如何将上面的时间戳字符串解析为Java.sql.timestamp

共有2个答案

姜嘉良
2023-03-14
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未来可能增加的一个试验场。时间你可以在这里找到一些有用的类,比如IntervalYearWeekYearQuarter,等等。

王昊
2023-03-14

使用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中返回的错误是 我在我做过的任何搜索中都找不到。我在这里错过了什么?