Java 如何将字符串“Mon Jan 01 00:00:00 AEDT 1990”转换为“1990101”?

Java 如何将字符串“Mon Jan 01 00:00:00 AEDT 1990”转换为“1990101”?,java,regex,string,date,parsing,Java,Regex,String,Date,Parsing,我有一个字符串Mon Jan 01 00:00:00 AEDT 1990,我需要将其转换为格式yyyyMMdd,因此在本例中它将是19900101 我认为用正则表达式可以做到这一点,这样我就可以把年份、月份和日期从字符串中转换为1等,但我对正则表达式不是很精通。有人有什么想法吗?现在假设每个传递的字符串中的每个月和天名称都匹配一个枚举名称值,即Mar匹配month.MARCH中字段名的值,而Marc或MARCH不匹配,并且您提供给我们的示例字符串的格式确实是一致的,由于它在运行期间不受更改,并且

我有一个字符串Mon Jan 01 00:00:00 AEDT 1990,我需要将其转换为格式yyyyMMdd,因此在本例中它将是19900101


我认为用正则表达式可以做到这一点,这样我就可以把年份、月份和日期从字符串中转换为1等,但我对正则表达式不是很精通。有人有什么想法吗?

现在假设每个传递的字符串中的每个月和天名称都匹配一个枚举名称值,即Mar匹配month.MARCH中字段名的值,而Marc或MARCH不匹配,并且您提供给我们的示例字符串的格式确实是一致的,由于它在运行期间不受更改,并且始终保持在年份始终为4位数字的位置,因此以下代码应能准确回答您的问题:

主类

CustomDateFormat类

输出

让我知道这是否符合您的要求,以及是否需要满足任何其他条件或考虑特殊情况。这是一个相当简单的实现,因此不需要花费时间来调整它以适应更具体的需求

编辑:修复一些实现错误,将示例字符串更改为自定义字符串,并删除多余的输出行

tl;博士 这太过分了

下面是一个使用java中内置的java.time类的单行程序解决方案

ZonedDateTime                            // Represent a moment as seen through the wall-clock time used by the people of a certain region (a time zone).
.parse(                                  // Parse the input text.
    "Mon Jan 01 00:00:00 AEDT 1990" ,     
    DateTimeFormatter.ofPattern( 
        "EEE MMM dd HH:mm:ss z uuuu" ,   // Specify a custom formatting pattern to match our input.
        Locale.US                        // Specify a `Locale` for the human language to use in translating the name of month& day-of-week.
    )                                    // Returns a `DateTimeFormatter` object.
)                                        // Returns a `ZonedDateTime` object.
.toLocalDate()                           // Extract the date, without time-of-day and without time zone. 
.format(                                 // Generate text to represent the value of our `LocalDate` object.
    DateTimeFormatter.BASIC_ISO_DATE     // Use the predefined formatting pattern YYYYMMDD.
)                                        // Returns a String.
19900101

java.time Regex在这方面做得太过分了

现代方法使用java.time类

指定自定义格式模式以适合您的输入

指定一个区域设置,以便于翻译星期几的名称和月份的名称

分区截止时间 解析为ZoneDateTime,一个特定地区的人们通过墙上的时钟看到的时刻,一个时区

String input = "Mon Jan 01 00:00:00 AEDT 1990";
Locale locale = Locale.US;
DateTimeFormatter f = DateTimeFormatter.ofPattern( "EEE MMM dd HH:mm:ss z uuuu" , locale );
ZonedDateTime zdt = ZonedDateTime.parse( input , f );

System.out.println( "zdt: " + zdt );
zdt:1990-01-01T00:00+11:00[澳大利亚/悉尼]

顺便说一下,您的输入字符串格式很糟糕。它使用2-4个字符的伪区,这些伪区不是实际时区,也不是标准化的,也不是唯一的!另一个问题是依赖英语。而且很难解析。教育发布数据的人员了解标准的美妙之处,该标准是为以文本形式交换日期时间值而创建的

本地日期 你只想要日期。所以提取一个LocalDate

所需的输出格式已在DateTimeFormatter类中定义。日期的标准格式是YYYY-MM-DD。它的一个变体称为基本含义,它最大限度地减少了分隔符的使用:YYYYMMDD

String output = ld.format( DateTimeFormatter.BASIC_ISO_DATE ) ;
19900101


检查一下这样的东西是否有用

//date string
String soTime = "Mon Jan 04 12:30:23 AEDT 1990";

//Format
SimpleDateFormat so = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy");

SimpleDateFormat desiredFormat = new SimpleDateFormat("yyyyMMdd");
desiredFormat.setTimeZone(TimeZone.getTimeZone("Australia/Sydney"));

Date sodate = so.parse(soTime);
System.out.println("DAY : " + desiredFormat.format(sodate));

尝试使用SimpleDateFormat,因为他使用的是自定义日期格式,所以无法使用。@Matthew我给出了一个输出日期的代码示例:19900101我知道了,不知道它可以使用自定义格式,做得好@Ole V.V我并没有推荐它的用法或建议它作为一种解决方案,我只是解释说我不知道这是可能的,因为我对它没有足够的了解,然后继续说“做得好”,以表明他的解决方案比我的好,就是这样。这些糟糕的类在几年前被现代的java.time类所取代。Sun、Oracle和JCP社区都放弃了这些类,采用了。你也应该这样做。请不要教年轻人使用过时的、臭名昭著的、麻烦的SimpleDateFormat类。至少不是第一个选择。而且不是毫无保留的。今天我们有了更好的in和它的DateTimeFormatter。谢谢。很好的回答。。。这让我太羞愧了,但至少我从中得到了一些练习。我将把它作为书签,因为它将来会派上用场,谢谢。@Matthew这里有一个工作的正则表达式示例也很好。您的解决方案对任何自定义日期格式都有效吗?如果不是的话,你能给我一个场景的例子,其中正则表达式是一个更好的解决方案吗?我想针对使用java.time不可行的场景进行实现,以使我的答案并非完全无用:D@BasilBourque感谢您提供的信息丰富的答案。是的,输入字符串的格式很糟糕,但我们使用的ERP系统就是这样输出的。@Matthew对于多种格式,您可以选择两种方式之一。您可以定义DateTimeFormatter对象的集合,每个对象都有一个自定义的格式模式,用于一种预期的格式。然后对每个输入循环集合,尝试每个格式化程序。如果引发异常,请尝试下一个。或者,您可以使用助手类DateTimeFormatterBuilder构建更灵活的格式化程序,DateTimeFormatterBuilder可以设置一些可选部分和一些默认部分。搜索堆栈溢出以了解更多信息,因为这已被多次解决。特别是通过Ole V.V.查找生成器示例。
String input = "Mon Jan 01 00:00:00 AEDT 1990";
Locale locale = Locale.US;
DateTimeFormatter f = DateTimeFormatter.ofPattern( "EEE MMM dd HH:mm:ss z uuuu" , locale );
ZonedDateTime zdt = ZonedDateTime.parse( input , f );

System.out.println( "zdt: " + zdt );
LocalDate ld = zdt.toLocalDate() ;  // Extract only the date, leaving behind the time-of-day and the time zone.
String output = ld.format( DateTimeFormatter.BASIC_ISO_DATE ) ;
//date string
String soTime = "Mon Jan 04 12:30:23 AEDT 1990";

//Format
SimpleDateFormat so = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy");

SimpleDateFormat desiredFormat = new SimpleDateFormat("yyyyMMdd");
desiredFormat.setTimeZone(TimeZone.getTimeZone("Australia/Sydney"));

Date sodate = so.parse(soTime);
System.out.println("DAY : " + desiredFormat.format(sodate));