格式日期从14 Aug到YYYYMMDD

时间:2011-03-07 13:03:12

标签: java date format

将日期14 8月2011更改为格式20110814 ..我怎么能在java中这样做?

这里14aug是一个字符串... String date =“14aug”;

4 个答案:

答案 0 :(得分:23)

SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
String yyyyMMdd = sdf.format(date);

参考:java.text.SimpleDateFormat

更新:精英绅士的问题非常重要。如果您从String开始,那么您应首先解析它以从上面的示例中获取date对象:

Date date = new SimpleDateFormat("dd MMM yyyy").parse(dateString);

答案 1 :(得分:3)

其他答案在2011年写完时是很好的答案。时间继续前进。今天,没有人应该使用现在已久的过时类SimpleDateFormatDate。现代答案使用java.time类:

    String date = "14 aug 2011";
    DateTimeFormatter parseFormatter = new DateTimeFormatterBuilder()
            .parseCaseInsensitive()
            .appendPattern("dd MMM uuuu")
            .toFormatter(Locale.ENGLISH);
    System.out.println(LocalDate.parse(date, parseFormatter)
                        .format(DateTimeFormatter.BASIC_ISO_DATE));

打印所需的:

20110814

现代解析机制有点严格,因为经验表明旧的解析机制过于宽松,并且在人们预期会出现错误消息的情况下经常产生令人惊讶的结果。例如,现代的案例需要正确的案例,即8月份的英语资本A,除非我们告诉它应该在没有区分大小写的情况下进行解析。所以这就是我对parseCaseInsensitive()的看法。该调用会影响以下构建器方法调用,因此我们必须将放在 appendPattern()之前。

编辑:从字面上的问题中取出字符串"14aug"SimpleDateFormat将使用1970年作为默认年份(纪元年),让您无法获得正确的年份。现代类允许您明确指定默认年份,例如:

    String date = "14aug";
    DateTimeFormatter parseFormatter = new DateTimeFormatterBuilder()
            .parseCaseInsensitive()
            .appendPattern("ddMMM")
            .parseDefaulting(ChronoField.YEAR, Year.now(ZoneId.systemDefault()).getValue())
            .toFormatter(Locale.ENGLISH);

通过此更改,今天运行代码我们得到:

20170814

编辑2:现在使用DateTimeFormatter.BASIC_ISO_DATE按照Basil Bourque’s answer中的建议进行格式化。

答案 2 :(得分:1)

虽然Bozho提供的示例适用于英语语言环境,但它可能无法在其他语言环境中使用(只要“aug”不是其他语言环境中的月份名称)。对于我的波兰语语言环境,我宁愿使用类似的东西:

ParsePosition pos = new ParsePosition(0);
Date date = new SimpleDateFormat("dd MMM yyyy", Locale.ENGLISH).parse("14 aug 2011", pos);

另请注意ParsePosition的使用,如果解析出现问题(然后date将为null),则会告诉您解析出现问题的位置。

答案 3 :(得分:1)

Answer by Ole V.V.很棒。它向您展示了使用java.time类的现代方法,而不是麻烦的旧遗留日期时间类(Date& Calendar)。

MonthDay

我将通过添加一个想法来扩展该答案:您可以表示您输入的星期几数字和缩写的月份名称作为MonthDay对象。

要了解DayeTimeFormatterBuilder在此处的使用情况,请参阅其他Answer by Ole V.V.

String input = "11aug" ;
DateTimeFormatter f = 
    new DateTimeFormatterBuilder()  
        .parseCaseInsensitive()
        .appendPattern( "ddMMM" )
        .toFormatter( Locale.ENGLISH )
;
MonthDay md = MonthDay.parse( input , f ) ;
  

md.toString(): - 08-11

如果可能,我建议使用ISO 8601标准格式--MM-DD以文本方式表示月日值,而不是您自己的自定义非标准格式。在解析和生成字符串时,包括MonthDay的java.time类在默认情况下使用标准格式,因此无需指定格式化模式。解析:MonthDay md = MonthDay.parse( "--08-11" ) ;

通过指定所需年份来生成仅限日期的值。具体来说,是LocalDate个对象。

LocalDate ld = md.atYear( 2011 ) ; 
  

ld.toString():2011-08-11

您所需的输出格式符合标准ISO 8601格式。您的格式是“基本”版本,可最大限度地减少分隔符的使用。此格式已在DateTimeFormatter.BASIC_ISO_DATE中定义。

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

20110811