2011-03-07 119 views
3

将日期2011年8月14日更改为格式20110814 ..我怎么能在java中做到这一点?格式日期从14八月到YYYYMMDD

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

+2

是'8月14日2011'日期字符串或日期对象? – 2011-03-07 13:07:31

回答

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

参考:java.text.SimpleDateFormat

更新:由精英绅士的问题是很重要的。如果你开始用String,那么你应该先分析它从上面的例子中得到date对象:

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

请记住,虽然该sdf不是线程安全的... – 2011-03-07 14:34:55

+1

该示例不会有线程问题。如果您决定将格式化程序作为实例字段而不是本地变量,那么请注意线程安全性。您可以使用ThreadLocal(常见做法) – Bozho 2011-03-07 14:51:49

+0

它不适用于“aug”不是月份名称的语言环境。 – 2011-03-08 06:37:44

1

虽然例如通过Bozho给出的是良好的英语语言环境中它可能不会在其他语言环境工作(只要as “aug”不是其他地区的月份名称)。对于我与波兰的语言环境的环境,我宁愿使用类似:

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

还要注意的ParsePosition使用它在解析问题的情况下(当时datenull)会告诉你在什么位置分析有很多麻烦。

1

其他答案在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

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) ; 
+0

当然是一个很好的选择。我认为我比我自己更喜欢它。一个原因是这一个更适合选择一年取决于日期。仅举一例,可能要求日期在未来6个月内;从“MonthDay”验证并计算正确的年份更容易。 – 2017-06-09 16:51:30

+0

@ OleV.V。我的答案是你的延伸,而不是替代方案。您给出了一个很好的解释和使用格式化器构建器来解析非标准输入的例子。 – 2017-06-09 17:07:34

相关问题