将Twitter4J日期转换为SQL日期

时间:2017-10-12 05:40:59

标签: java sql datetime-format java.util.date

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

在Java SQL中,我需要这种日期格式:2017-10-11 17:30:20

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

这是我的代码:

Date createdAt = message.getCreatedAt();

2 个答案:

答案 0 :(得分:2)

好吧,似乎java.util.Date方法返回一个java.sql.Date对象,所以如果你需要实例化一个Date createdAt = message.getCreatedAt(); java.sql.Date sqlCreatedAt = new java.sql.Date(createdAt.getTime()) 实例来保存你的数据库,你可以简单地这样做:

$data=Project::where('pid', 35)->get();
$eve=Event::where('pro_id', 35)->get();
$don=Donation::where('pro_id', 35)->get();
$opp=Opportunity::where('pro_id', 35)->get();
return view('other.detailedProject', compact('data', 'eve', 'don', 'opp'));

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

答案 1 :(得分:0)

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。请注意,您的CEST 实际上是一个时区,但ZonedDateTime会猜测解释。这样的3-4个字母伪区域给出了关于时区的提示,但是没有标准化,甚至不是唯一的(!)。这与输入字符串的其余部分一起,是日期时间格式的可怕选择。只要有可能,请使用标准ISO 8601格式。

continent/region的格式指定proper time zone name,例如America/MontrealAfrica/CasablancaPacific/Auckland

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

通常最好以UTC工作。提取Instant对象。 Instant类代表UTC中时间轴上的一个时刻,分辨率为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对象缺少time zoneoffset-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框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendar和& SimpleDateFormat

现在位于Joda-Timemaintenance mode项目建议迁移到java.time类。

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310

从哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuartermore