一个JavaScript客户端向我的服务器发送一些字符串,其中之一以JavaScript Date对象的字符串表示形式形式出现。
现在,这个JavaScript Date对象有它自己的格式,我想知道是否有一个类可以做正确的转换,因为我正在使用SimpleDateFormatter
时遇到问题。
这是JavaScript Date字符串的样子:Tue Feb 12 2013 21:12:28 GMT+0100 (CET)
一个JavaScript客户端向我的服务器发送一些字符串,其中之一以JavaScript Date对象的字符串表示形式形式出现。
现在,这个JavaScript Date对象有它自己的格式,我想知道是否有一个类可以做正确的转换,因为我正在使用SimpleDateFormatter
时遇到问题。
这是JavaScript Date字符串的样子:Tue Feb 12 2013 21:12:28 GMT+0100 (CET)
在Javascript中序列化日期的最佳方法是使用 toUTCString
(而不仅仅是toString()
);toUTCString
将产生一个rfc 822日期(与http使用的格式相同)。然后您可以使用以下SimpleDateFormat模式在Java中解析它:
new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss z", Locale.ENGLISH)
.toUTCString()
,则可以使用以下格式:"EE MMM d y H:m:s 'GMT'Z (zz)"
。请注意,我已经尽力让翻译内容保持原意并更加通俗易懂,如果有需要解释或其他信息,请另外提问。 - Valentin Waeselynck话虽如此,我们需要了解更多关于您尝试解析的格式以及 SimpleDateFormatter
出现的错误。 (作为一般准则,如果您与某些东西"遇到问题"并希望解决这些问题,最好描述问题是什么,最好使用一个简短但完整的程序来演示问题。)
java.util
日期时间API及其格式化API SimpleDateFormat
已经过时且容易出错。建议完全停止使用它们,改用现代日期时间API*。
此外,以下是来自Joda-Time首页的通知:
请注意,从Java SE 8开始,用户被要求迁移到java.time(JSR-310)- JDK的核心部分,取代了该项目。
使用现代日期时间API java.time
的解决方案:
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Locale;
public class Main {
public static void main(String[] args) {
String strDateTime = "Tue Feb 12 2013 21:12:28 GMT+0100 (CET)";
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("E MMM d u H:m:s VVZ (z)", Locale.ENGLISH);
ZonedDateTime zdt = ZonedDateTime.parse(strDateTime, dtf);
System.out.println(zdt);
}
}
输出:
2013-02-12T21:12:28+01:00[Europe/Paris]
如果需要将ZonedDateTime
对象转换为java.util.Date
对象,可以按照以下方式进行:
Date date = Date.from(zdt.toInstant());
了解有关现代日期时间 API 的更多信息,请参阅教程:日期时间。
* 如果由于任何原因,您必须坚持使用Java 6或Java 7,您可以使用ThreeTen-Backport,该工具将大部分java.time功能移植到Java 6和7中。如果您正在为Android项目工作,并且您的Android API级别仍未符合Java-8标准,请查看通过解糖使用Java 8+ API和如何在Android项目中使用ThreeTenABP。