将日期14 8月2011更改为格式20110814 ..我怎么能在java中这样做?
这里14aug是一个字符串... String date =“14aug”;
答案 0 :(得分:23)
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
String yyyyMMdd = sdf.format(date);
更新:精英绅士的问题非常重要。如果您从String
开始,那么您应首先解析它以从上面的示例中获取date
对象:
Date date = new SimpleDateFormat("dd MMM yyyy").parse(dateString);
答案 1 :(得分:3)
其他答案在2011年写完时是很好的答案。时间继续前进。今天,没有人应该使用现在已久的过时类SimpleDateFormat
和Date
。现代答案使用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