Java 字符串到日期、ParseException

发布于 2024-11-29 06:03:26 字数 324 浏览 3 评论 0 原文

我有一个名为 DateCompareOld 的字符串,它的值为“Fri Aug 12 16:08:41 EDT 2011”。我想将其转换为日期对象。

 SimpleDateFormat dateType =  new SimpleDateFormat("E M dd H:m:s z yyyy");
 Date convertDate = dateType.parse(DateCompareOld);

但每次我尝试这个时,我都会遇到解析异常。我尝试过其他 SimpleDateFormat 格式化标准,但总是失败。

建议?

I have a string named DateCompareOld, it has the value "Fri Aug 12 16:08:41 EDT 2011". I want to convert this to a date object.

 SimpleDateFormat dateType =  new SimpleDateFormat("E M dd H:m:s z yyyy");
 Date convertDate = dateType.parse(DateCompareOld);

But everytime I try this, I get a parse exception. I have tried other SimpleDateFormat formatting criteria, but it always fails.

Suggestions?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

司马昭之心 2024-12-06 06:03:27

尝试以下格式:

EEE MMM dd HH:mm:ss zzz yyyy

快速测试:

public static void main(String[] args) throws Exception {
    DateFormat df = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy");
    System.out.println(df.parse("Fri Aug 12 16:08:41 EDT 2011"));
}

// outputs
Fri Aug 12 15:08:41 CDT 2011

输出为 CDT,因为那是我所在的位置,但值是正确的。

Try this format:

EEE MMM dd HH:mm:ss zzz yyyy

Quick test:

public static void main(String[] args) throws Exception {
    DateFormat df = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy");
    System.out.println(df.parse("Fri Aug 12 16:08:41 EDT 2011"));
}

// outputs
Fri Aug 12 15:08:41 CDT 2011

Output is in CDT, since that's where I am, but the value is right.

鲸落 2024-12-06 06:03:27
DateFormat dateType =  new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy");
dateType.setLenient(false);
Date convertDate = dateType.parse(DateCompareOld);
DateFormat dateType =  new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy");
dateType.setLenient(false);
Date convertDate = dateType.parse(DateCompareOld);
情场扛把子 2024-12-06 06:03:27

java.time

旧版日期时间 API(java.util 日期时间类型及其格式化 API,SimpleDateFormat)已过时且存在错误 -易于。建议完全停止使用它们并切换到 java.time,即 现代日期时间 API*

另一件需要注意的重要事情是,您的字符串包含 English 文本,因此您必须使用 Locale.ENGLISH,这样当您的代码被执行时,您就不会收到异常或错误结果。在 Locale 不是 English 的 JVM 上运行。无论如何,永远不要使用日期时间解析/格式化类型(例如 SimpleDateFormatDateTimeFormatter 等),没有 Locale,因为这些类型对 Locale 敏感。

使用现代日期时间 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 = "Fri Aug 12 16:08:41 EDT 2011";
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("E MMM d H:m:s z u", Locale.ENGLISH);
        ZonedDateTime zdt = ZonedDateTime.parse(strDateTime, dtf);
        System.out.println(zdt);
    }
}

输出:

2011-08-12T16:08:41-04:00[America/New_York]

如果您需要一个 java.util.Date 对象,您可以通过以下方式获取它:如下所示:

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

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

使用旧版 API:

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;

public class Main {
    public static void main(String args[]) throws ParseException {
        String strDateTime = "Fri Aug 12 16:08:41 EDT 2011";
        SimpleDateFormat sdf = new SimpleDateFormat("E MMM d H:m:s z y", Locale.ENGLISH);
        Date date = sdf.parse(strDateTime);
        // ...
    }
}

请注意,java.util.Date 对象不是像 现代日期时间类型;相反,它表示自称为“纪元”的标准基准时间(即 1970 年 1 月 1 日 00:00:00 GMT(或 UTC))以来的毫秒数。当您打印 java.util.Date 对象时,其 toString 方法返回 JVM 时区中的日期时间(根据该毫秒值计算)。如果您需要打印不同时区的日期时间,则需要将时区设置为 SimpleDateFormat 并从中获取格式化字符串。


* 无论出于何种原因,如果您必须坚持使用 Java 6 或 Java 7,您可以使用 ThreeTen-Backport 将大部分 java.time 功能向后移植到 Java 6 和 Java 6 7. 如果您正在处理 Android 项目,并且您的 Android API 级别仍然不符合 Java-8,请检查 通过脱糖提供 Java 8+ API如何在Android项目中使用ThreeTenABP

java.time

The legacy date-time API (java.util date-time types and their formatting API, SimpleDateFormat) are outdated and error-prone. It is recommended to stop using them completely and switch to java.time, the modern date-time API*.

Another important thing to note is that your string has English text and therefore you must use Locale.ENGLISH so that you do not get an exception or some wrong result when your code is run on a JVM whose Locale is not English. Anyway, NEVER use a date-time parsing/formatting type (e.g. SimpleDateFormat, DateTimeFormatter etc.) without Locale because these types are Locale-sensitive.

Demo using modern date-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 = "Fri Aug 12 16:08:41 EDT 2011";
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("E MMM d H:m:s z u", Locale.ENGLISH);
        ZonedDateTime zdt = ZonedDateTime.parse(strDateTime, dtf);
        System.out.println(zdt);
    }
}

Output:

2011-08-12T16:08:41-04:00[America/New_York]

If at all, you need a java.util.Date object, you can obtain it as follows:

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

Learn more about the modern date-time API from Trail: Date Time.

Using the legacy API:

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;

public class Main {
    public static void main(String args[]) throws ParseException {
        String strDateTime = "Fri Aug 12 16:08:41 EDT 2011";
        SimpleDateFormat sdf = new SimpleDateFormat("E MMM d H:m:s z y", Locale.ENGLISH);
        Date date = sdf.parse(strDateTime);
        // ...
    }
}

Note that the java.util.Date object is not a real date-time object like the modern date-time types; rather, it represents the number of milliseconds since the standard base time known as "the epoch", namely January 1, 1970, 00:00:00 GMT (or UTC). When you print an object of java.util.Date, its toString method returns the date-time in the JVM's timezone, calculated from this milliseconds value. If you need to print the date-time in a different timezone, you will need to set the timezone to SimpleDateFormat and obtain the formatted string from it.


* For any reason, if you have to stick to Java 6 or Java 7, you can use ThreeTen-Backport which backports most of the java.time functionality to Java 6 & 7. If you are working for an Android project and your Android API level is still not compliant with Java-8, check Java 8+ APIs available through desugaring and How to use ThreeTenABP in Android Project.

你好,陌生人 2024-12-06 06:03:27

请注意,传递给 SimpleDateFormat() 的字符串应更正为“EEE MMM dd HH:mm:ss z yyyy”

以下是代码:

import java.util.Date;
import java.text.SimpleDateFormat;
import java.text.ParseException;
public class DateTest{
public static void main(String []args){
    String DateCompareOld = "Fri Aug 12 16:08:41 EDT 2011";
    SimpleDateFormat dateType =  new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy");
    Date convertDate = new Date();
    try{
     convertDate = dateType.parse(DateCompareOld);
    }catch(ParseException pex){
        pex.printStackTrace();
    }
    System.out.println(convertDate.toString());
  }

}

Note the String passed to SimpleDateFormat() should be corrected to "EEE MMM dd HH:mm:ss z yyyy"

Here is the code:

import java.util.Date;
import java.text.SimpleDateFormat;
import java.text.ParseException;
public class DateTest{
public static void main(String []args){
    String DateCompareOld = "Fri Aug 12 16:08:41 EDT 2011";
    SimpleDateFormat dateType =  new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy");
    Date convertDate = new Date();
    try{
     convertDate = dateType.parse(DateCompareOld);
    }catch(ParseException pex){
        pex.printStackTrace();
    }
    System.out.println(convertDate.toString());
  }

}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文