某些字符串的 DateFormat 模式

Posted

技术标签:

【中文标题】某些字符串的 DateFormat 模式【英文标题】:DateFormat Pattern for some strings 【发布时间】:2012-06-02 05:39:47 【问题描述】:

我有一些不同格式的日期要解析,但我无法用SimpleDateFormat 识别它们。谁能帮我找到这个日期的模式:

1892 年 7 月 6 日 1915 年 5 月 9 日 2 月 335 日 1768-02-12

公元前 63 年 9 月 23 日 14 年 8 月 19 日

谢谢

【问题讨论】:

***.com/q/3850784/1140748 我第一次遇到一个关于在 BC 中指定的转换时间的问题 :) +1 好吧,它们都不是简单的日期格式 1892 年 7 月 6 日将类似于“d MMMM yyyy”。您将在 BC 中获得一些乐趣,并且是 1768-02-12 2 月 12 日或 12 月 2 日 另请注意,有些是不可能可靠解析的。 1768-02-12 可能意味着 2 月 12 日或 12 月 2 日。 美国真的应该“接受这个计划”:其他地方都使用“理智”yyyy-MM-dddd-MM-yyyy(注意它是如何从最大到最小,反之亦然)。美式格式就像把“五百四十三”写成534! 【参考方案1】:

在这里,您可以找到一个很棒的生成器,用于创建您可以想象的每种日期格式 http://www.fileformat.info/tip/java/simpledateformat.htm

例如您的前两个示例都是使用 dd MMMM yyyy 生成的;)

【讨论】:

这没有回答如何在 Java 中做到这一点 你只需要将生成的格式放入SimpleDateFormat()中 点击网站上的链接 (docs.oracle.com/javase/1.5.0/docs/api/java/text/…)。有一个描述如何在 bc 中转换。 "...在解析过程中,只有由 Character.isDigit(char) 定义的恰好包含两位数字的字符串才会被解析为默认世纪。任何其他数字字符串,例如一位数字字符串、三位或更多数字字符串,或不是所有数字的两位数字字符串(例如,“-1”),按字面意思解释。因此,使用相同的模式解析“01/02/3”或“01/02/003” ,如公元 3 年 1 月 2 日。同样,“01/02/-3”被解析为公元前 4 年 1 月 2 日。”【参考方案2】:

Joda 如果您必须使用多种格式进行解析,通常会更好。例如,

        private static DateTimeFormatter dateFormatter;
        String[] validDateFormats = new String[]  "dd-MMM-yyyy HH:mm:ss",
                "yyyy-MM-dd HH:mm:ss.SSS" ;
        DateTimeParser[] parsers = new DateTimeParser[validDateFormats.length];
        for (int i = 0; i < validDateFormats.length; ++i) 
            parsers[i] = DateTimeFormat.forPattern(validDateFormats[i])
                    .getParser();
        
        dateFormatter = new DateTimeFormatterBuilder().append(null, parsers)
                .toFormatter().withZone(DateTimeZone.UTC);

现在,如果输入匹配任何格式,则此 dateFormatter 将正确解析:

        inputDate = dateFormatter.parseDateTime(dateStr);
        DateTimeFormatter outputFormat = DateTimeFormat
                .forPattern("yyyy/MM/dd");
        String outputString = inputDate.toString(outputFormat);

格式字符串可以从这里查到:http://joda-time.sourceforge.net/api-release/org/joda/time/format/DateTimeFormat.html

【讨论】:

【参考方案3】:

您只需提供您希望您的日期被解析的模式的可能性,并通过它们找到第一个匹配项。

Run solution.

【讨论】:

你是最简单有效的解决方案 :) 我的问题是我不使用语言环境 .. 所以我认为它是用意大利语格式化的 :) 非英国/美国公民的常见问题,乐于提供帮助。【参考方案4】:

试试这些

2012 年 5 月 27 日:

System.out.println(new SimpleDateFormat("d-MMM-YYYY").format(new Date()));

27-05-2012 :

System.out.println(new SimpleDateFormat("d-MM-YYYY").format(new Date()));

27-05-12 :

System.out.println(new SimpleDateFormat("dd-MM-YY").format(new Date()));

【讨论】:

以上是关于某些字符串的 DateFormat 模式的主要内容,如果未能解决你的问题,请参考以下文章

DateFormat--日期/时间格式化

DateFormat--日期/时间格式化

javaWEB国际化:DateFormat,NumberFormat,MessageFormat,ResourceBundle的使用

DateFormat类中getDateTimeInstance的各种时间获得器

java与模式,这段代码怎么反映简单工厂模式了?

Java Format 格式化