tl;博士
您的输入格式很差,但在这种情况下可以使用现代的 java.time 类进行解析。请注意,不幸地使用 3-4 个字母的伪区域(例如 CEST)不是标准化的并且不是唯一的,因此它们不能总是被解析为您的预期区域。
对于 Java 8 及更高版本,这些类是内置的。对于 Java 6 和 7,请参阅下面详细介绍的 ThreeTen-Backport 项目。
ZonedDateTime.parse( // Parse an input string as a date-time moment.
"Tue Jul 31 00:53:43 CEST 2018" ,
DateTimeFormatter.ofPattern( "EEE MMM d HH:mm:ss zzz uuuu", Locale.US ) // Specify `Locale` to determine human language and cultural norms to be used in translation.
) // Returns a `ZonedDateTime` object.
.withZoneSameInstant( // Adjust from one zone to another.
ZoneId.of( "Europe/Copenhagen" ) // Always use `Continent/Region` time zone names, never 3-4 letter pseudo-codes such as `CEST`.
)
.toString() // Generate a `String` with text in standard ISO 8601 format wisely extended by appending the name of the time zone in square brackets.
2018-07-31T00:53:43+02:00[欧洲/哥本哈根]
java.time
这已经讨论过很多次了,所以搜索 Stack Overflow 以获取更多讨论。
解析
String input = "Tue Jul 31 00:53:43 CEST 2018";
DateTimeFormatter f = DateTimeFormatter.ofPattern( "EEE MMM d HH:mm:ss zzz uuuu", Locale.US );
ZonedDateTime zdt = ZonedDateTime.parse( input , f );
zdt.toString(): 2018-07-31T00:53:43+02:00[欧洲/巴黎]
调整
调整为丹麦时区。我会随意选择Europe/Copenhagen。 Denmark 可能有其他区域,例如格陵兰或王国其他地区。
以continent/region 的格式指定proper time zone name,例如America/Montreal、Africa/Casablanca 或Pacific/Auckland。切勿使用 3-4 个字母的缩写,例如 EST 或 IST,因为它们不是真正的时区,没有标准化,甚至不是唯一的 (!)。
ZoneId z = ZoneId.of( "Europe/Copenhagen" ) ;
ZonedDateTime zdtCopenhagen = zdt.withZoneSameInstant( z ); // Same moment, different wall-clock time.
2018-07-31T00:53:43+02:00[欧洲/哥本哈根]
请注意,在那个日期和时间,巴黎和哥本哈根time zones 共享相同的offset-from-UTC,因此它们感知到相同的时间。
ISO 8601
您的输入字符串使用了 可怕的 格式。它难以解析,假定为英语,并且包含冗余信息。
将日期时间值作为文本交换时,仅使用标准的ISO 8601 格式。
请注意,ZonedDateTime 类明智地扩展了该格式,将时区名称附加在方括号中。这可以在上面的输出中看到。
关于java.time
java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧 legacy 日期时间类,例如 java.util.Date、Calendar 和 SimpleDateFormat。
Joda-Time 项目现在位于maintenance mode,建议迁移到java.time 类。
要了解更多信息,请参阅Oracle Tutorial。并在 Stack Overflow 上搜索许多示例和解释。规格为JSR 310。
您可以直接与您的数据库交换 java.time 对象。使用符合JDBC 4.2 或更高版本的JDBC driver。不需要字符串,不需要java.sql.* 类。
从哪里获得 java.time 类?
ThreeTen-Extra 项目通过附加类扩展了 java.time。该项目是未来可能添加到 java.time 的试验场。您可以在这里找到一些有用的类,例如Interval、YearWeek、YearQuarter 和more。