Java 将区域设置日期转换为mysql日期时间格式

Java 将区域设置日期转换为mysql日期时间格式,java,date,data-conversion,Java,Date,Data Conversion,我从结果中得到以下字符串。如何在java中智能地将其转换为mysql日期时间格式 Montag, 09. April 2018, 11:00 Uhr 提前感谢您可以有效地做到这一点,但我不知道这是否是一个好主意 无论如何,这是技术上可行的: String s = "Montag, 09. April 2018, 11:00 Uhr"; DateTimeFormatter formatter = DateTimeFormatter .ofPattern("EEEE, dd

我从结果中得到以下字符串。如何在java中智能地将其转换为mysql日期时间格式

Montag, 09. April 2018, 11:00 Uhr

提前感谢

您可以有效地做到这一点,但我不知道这是否是一个好主意

无论如何,这是技术上可行的:

String s = "Montag, 09. April 2018, 11:00 Uhr";
DateTimeFormatter formatter = DateTimeFormatter
            .ofPattern("EEEE, dd. MMMM yyyy, HH:mm 'Uhr'", Locale.GERMANY);
// Parse with the German format
LocalDateTime dateTime = LocalDateTime.parse(s, formatter); // Using Java 8 libraries
// Format with the MySQL format (Well, actually ISO)
final DateTimeFormatter formatterMysql = DateTimeFormatter.ISO_DATE_TIME;
System.out.println(formatterMysql.format(dateTime).replace("T", " "));
这将打印出:

2018-04-09 11:00:00
MySQL应该理解它。

tl;博士 向数据库发送对象,而不是字符串

myPreparedStatement.setObject(                      // JDBC 4.2 and later allows direct exchange of java.time objects with a database. 
    … ,                      
    DateTimeFormatter.ofPattern(                    // Define a formatter based on a specific pattern.
        "EEEE, dd. MMMM yyyy, HH:mm 'Uhr'" ,        // Pattern to match our input text.
        Locale.GERMANY                              // Locale specifies human language used to parse the name of day, name of month, etc.
    ).parse( "Montag, 09. April 2018, 11:00 Uhr" )  // Generate a `ZonedDateTime` object. 
)
智能对象,而不是哑字符串 首先,阅读吉尔·费尔南德斯(gil.fernandes)的文章

您的短语“mysql日期时间格式”建议使用字符串。不应将日期时间值作为文本与数据库交换。我们有这方面的课程

将输入字符串解析为LocalDateTime对象,如该答案所示

DateTimeFormatter f = 
    DateTimeFormatter.ofPattern(
        "EEEE, dd. MMMM yyyy, HH:mm 'Uhr'" , 
        Locale.GERMANY
    )
;
LocalDateTime ldt = 
    LocalDateTime.parse( 
        "Montag, 09. April 2018, 11:00 Uhr" , 
        f 
    ) 
;
使用JDBC4.2或更高版本,将该对象发送到数据库。请注意,LocalDateTime只应发送到SQL标准时间戳类型的列,而不发送时区

检索:

LocalDateTime ldt = myResultSet.getObject( … , LocalDateTime.class ) ;
关于java.time 该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,例如,&

该项目现已启动,建议迁移到类

要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释。规格是

从哪里获得java.time类

,及以后 内置的。 标准JavaAPI的一部分,带有捆绑实现。 Java9添加了一些次要功能和修复。 和 大部分java.time功能都在中向后移植到Java6和Java7。 更高版本的Android捆绑包实现了java.time类。 对于早期的Android,该项目采用了上面提到的Three-Ten Backport。看见
该项目使用其他类扩展了java.time。这个项目是java.time将来可能添加的一个试验场。您可以在这里找到一些有用的类,例如、、和。

在本文中,智能化意味着什么?是什么让你认为日期是MySql格式的?您可以发布从数据库检索日期的代码吗?如果您使用的是jdbc getDate,您根本不需要任何转换,因为您应该已经有了一个日期对象。为什么需要将其转换为MySQL日期格式?您不应该以文本形式与MySQL交换日期值。始终使用java.sql.Timestamp.Show您的努力第一。。。我们不是来为您编写代码的……事实上,从Java8&9中的JDBC4.2开始,java.sql.Timestamp已经被java.time.Instant取代。请参阅PreparedStatement::setObject和ResultSet::getObject。@安东尼:不,不是dup。这个问题是针对Hibernate的,而不是。但我敢打赌,还有许多其他的问题,这是一个重复的问题。总体来说,回答不错,但打电话是不明智的。该调用会立即影响在同一JVM中所有应用程序的所有线程中运行的所有代码。最好将Locale对象传递给java.time类,比如可选的第二个参数to。我更喜欢只在格式化程序上设置德语区域设置,而不是在整个系统上设置。正如您或多或少所说,我更愿意将LocalDateTime对象保存到MySQL,而不是格式化的日期时间字符串。PreparedStatement.setObject将接受LocalDateTime,前提是JDBC驱动程序至少是JDBC 4.2,但MySQL的此类驱动程序已经存在很长时间了。@BasilBourque您完全正确。我已经根据你的建议更新了答案。
LocalDateTime ldt = myResultSet.getObject( … , LocalDateTime.class ) ;