在Java中解析JavaScript日期字符串

9

一个JavaScript客户端向我的服务器发送一些字符串,其中之一以JavaScript Date对象的字符串表示形式形式出现。

现在,这个JavaScript Date对象有它自己的格式,我想知道是否有一个类可以做正确的转换,因为我正在使用SimpleDateFormatter时遇到问题。

这是JavaScript Date字符串的样子:Tue Feb 12 2013 21:12:28 GMT+0100 (CET)


你在使用SimpleDateFormatter时遇到了什么问题? - Tim Büthe
试试moment.js,相信我,你会摆脱所有这些烦人的问题。 - Andres Elizondo
3个回答

12

在Javascript中序列化日期的最佳方法是使用 toUTCString(而不仅仅是toString());toUTCString将产生一个rfc 822日期(与http使用的格式相同)。然后您可以使用以下SimpleDateFormat模式在Java中解析它:

new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss z", Locale.ENGLISH)

3
如果您无法控制日期的生成,并且不能使用.toUTCString(),则可以使用以下格式:"EE MMM d y H:m:s 'GMT'Z (zz)"。请注意,我已经尽力让翻译内容保持原意并更加通俗易懂,如果有需要解释或其他信息,请另外提问。 - Valentin Waeselynck

3
个人而言,我更喜欢使用Joda Time格式化器,主要原因是它们是线程安全和不可变的,因此您可以创建一个实例,并静态地重复使用,无需任何担忧。Joda 还允许轻松指定时区等信息。当然,它们最终会创建 Joda 对象,这是另一个我认为很有优势的地方—在尽可能避免使用Java的日期/时间API。

话虽如此,我们需要了解更多关于您尝试解析的格式以及 SimpleDateFormatter出现的错误。 (作为一般准则,如果您与某些东西"遇到问题"并希望解决这些问题,最好描述问题是什么,最好使用一个简短但完整的程序来演示问题。)


1

java.time

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接