有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

在Java中解析JavaScript日期字符串

JavaScript客户端向我的服务器发送一些字符串,其中一个字符串是JavaScript日期对象的字符串表示形式

现在,这个JavaScript日期对象有它自己的格式,我只是想知道是否有一个类可以进行正确的转换,因为我遇到了SimpleDateFormatter的问题

这是JavaScript日期字符串的外观:Tue Feb 12 2013 21:12:28 GMT+0100 (CET)


共 (3) 个答案

  1. # 1 楼答案

    就我个人而言,我更喜欢Joda Time格式化程序的一个主要原因是:它们是线程安全且不可变的,因此您可以创建一个,静态地保存它,并毫无顾虑地重用它。Joda还允许简单地指定时区等。当然,它们最终会创建Joda对象,这在我看来是另一个优势——我尽量避开Java的日期/时间API

    话虽如此,我们需要更多地了解您试图解析的格式,以及SimpleDateFormatter的问题所在。(一般来说,如果你在某件事情上“遇到问题”并希望解决这些问题,那么描述问题是什么会有帮助的,最好是用一个简短但完整的程序来演示问题。)

  2. # 2 楼答案

    爪哇。时间

    java.util日期时间API及其格式化APISimpleDateFormat已过时且容易出错。建议完全停止使用它们,并切换到modern Date-Time API*

    此外,以下引述的是home page of Joda-Time的通知:

    Note that from Java SE 8 onwards, users are asked to migrate to java.time (JSR-310) - a core part of the JDK which replaces this project.

    使用java.time现代日期时间API的解决方案:

    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]
    

    ONLINE DEMO

    出于任何原因,如果需要将此ZonedDateTime对象转换为java.util.Date对象,可以按如下方式执行:

    Date date = Date.from(zdt.toInstant());
    

    Trail: Date Time了解有关现代日期时间API的更多信息


    *无论出于何种原因,如果您必须坚持使用Java 6或Java 7,您都可以使用ThreeTen-Backport作为大多数Java的后台端口。Java 6&;的时间功能;7.如果您正在为Android项目工作,并且您的Android API级别仍然不符合Java-8,请选中Java 8+ APIs available through desugaringHow to use ThreeTenABP in Android Project

  3. # 3 楼答案

    在javascript中序列化日期的最佳方法是使用toUTCString(而不仅仅是toString()toUTCString将生成rfc 822日期(与http使用的格式相同)。然后,您可以使用以下SimpleDataFormat模式在java中对其进行解析:

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