将 Twitter4J 日期转换为 SQL 日期

Converting Twitter4J Date to SQL Date

我的日期格式来自 Twitter API:Wed Oct 11 17:30:20 CEST 2017

In Java SQL 我需要这样的日期格式:2017-10-11 17:30:20

如何转换日期格式以便插入到数据库中?

这是我的代码:

Date createdAt = message.getCreatedAt();

嗯,getCreatedAt()方法returns似乎是一个java.util.Date对象,所以如果你需要实例化一个java.sql.Date实例来保存在你的数据库中,你可以简单地这样做:

Date createdAt = message.getCreatedAt();
java.sql.Date sqlCreatedAt = new java.sql.Date(createdAt.getTime())

http://twitter4j.org/javadoc/twitter4j/Status.html#getCreatedAt--

tl;博士

使用对象,而不是字符串。

myPreparedStatement.setObject( 
    … , 
    ZonedDateTime.parse( 
        "Wed Oct 11 17:30:20 CEST 2017" , 
        DateTimeFormatter.ofPattern( "EEE MMM dd HH:mm:ss z uuuu" , Locale.US ) 
    ).toInstant() 
)

java.time

使用JDBC 4.2 及更高版本,您可以直接与数据库交换java.time 对象。 不需要乱搞字符串,也不需要麻烦的旧遗留日期时间类,例如java.sql.Date/java.sql.Timestamp.

为您的输入定义格式模式。指定一个 Locale 来表示翻译日名和月名所需的人类语言。

String input = "Wed Oct 11 17:30:20 CEST 2017";
DateTimeFormatter f = DateTimeFormatter.ofPattern( "EEE MMM dd HH:mm:ss z uuuu" , Locale.US );

改为解析为 ZonedDateTime given that your input includes a hint about the time zone. Note that your CEST is not actually a time zone, but ZonedDateTime will take a guess at interpreting. Such 3-4 letter pseudo-zones give a hint about the time zone, but are not standardized and are not even unique(!). This, along with the rest of your input string, is a terrible choice of date-time formats. Whenever possible, use standard ISO 8601 格式。

指定 proper time zone name in the format of continent/region, such as America/Montreal, Africa/CasablancaPacific/Auckland

ZonedDateTime zdt = ZonedDateTime.parse( input , f );

通常最好在 UTC 中工作。提取一个 Instant 对象。 Instant class represents a moment on the timeline in UTC with a resolution of nanoseconds(最多九 (9) 位小数)。

Instant instant = zdt.toInstant() ;

通过支持 JDBC 4.2 或更高版本的 JDBC driver 将其传递到您的数据库。

myPreparedStatement.setObject( … , instant ) ;

检索:

Instant instant = myResultSet.getObject( … , Instant.class ) ;

如果您的数据库列的类型是 TIMESTAMP WITHOUT TIME ZONE 而不是 TIMESTAMP WITH TIME ZONE,则使用 LocalDateTime 对象而不是 ZonedDateTime/InstantLocalDateTime object lacks any concept of time zone or offset-from-UTC.

LocalDateTime ldt = zdt.toLocalDateTime() ;
myPreparedStatement.setObject( … , ldt ) ;

旧版 java.util.Date

如果您的 Twitter 调用实际上返回了 java.util.Date 对象而不是字符串,请转换为 Instant 并按照上述步骤进行测试。

Instant instant = myJavaUtilDate.toInstant() ;  // Convert from troublesome legacy `Date` class to modern `Instant` class.

关于java.time

java.time framework is built into Java 8 and later. These classes supplant the troublesome old legacy date-time classes such as java.util.Date, Calendar, & SimpleDateFormat.

Joda-Time project, now in maintenance mode, advises migration to the java.time 类.

要了解更多信息,请参阅 Oracle Tutorial. And search Stack Overflow for many examples and explanations. Specification is JSR 310

在哪里获取java.time类?

  • Java SE 8, Java SE 9,及以后
    • 内置。
    • 标准 Java API 的一部分,带有捆绑实施。
    • Java 9 添加了一些小功能和修复。
  • Java SE 6 and Java SE 7
  • Android
    • Android java.time 类.
    • 捆绑实施的更高版本
    • 对于较早的 Android,ThreeTenABP project adapts ThreeTen-Backport (mentioned above). See

ThreeTen-Extra project extends java.time with additional classes. This project is a proving ground for possible future additions to java.time. You may find some useful classes here such as Interval, YearWeek, YearQuarter, and more.