Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 格式日期为8月14日至YYYYMMDD_Java_Date_Format - Fatal编程技术网

Java 格式日期为8月14日至YYYYMMDD

Java 格式日期为8月14日至YYYYMMDD,java,date,format,Java,Date,Format,将日期2011年8月14日更改为格式20110814。。我如何在java中做到这一点 这里是一个字符串。。。字符串date=“14aug” 参考: 更新:精英绅士提出的问题很重要。如果以字符串开始,则应首先对其进行解析,以从上述示例中获取日期对象: Date date = new SimpleDateFormat("dd MMM yyyy").parse(dateString); 虽然Bozho给出的示例适用于英语语言环境,但它可能不适用于其他语言环境(只要“aug”在其他语言环境中不是月名)

将日期2011年8月14日更改为格式20110814。。我如何在java中做到这一点

这里是一个字符串。。。字符串date=“14aug”

参考:

更新:精英绅士提出的问题很重要。如果以
字符串开始
,则应首先对其进行解析,以从上述示例中获取
日期
对象:

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

虽然Bozho给出的示例适用于英语语言环境,但它可能不适用于其他语言环境(只要“aug”在其他语言环境中不是月名)。对于使用波兰语言环境的环境,我更愿意使用以下内容:

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

还要注意使用
ParsePosition
,如果出现解析问题(那么
date
将为
null
),它将告诉您解析遇到问题的位置。

其他答案在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
现代的解析机制有点严格,因为经验表明,旧的解析机制过于宽松,并且在预期会出现错误消息的情况下常常会产生令人惊讶的结果。例如,现代语法需要正确的大小写,即英语中的大写字母A,除非我们告诉它应该不区分大小写。这就是我使用
parseCaseSensitive()
所做的。该调用会影响以下生成器方法调用,因此我们必须将其置于
appendPattern()
之前

编辑:从问题中逐字提取字符串
“14aug”
SimpleDataFormat
会使用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\u ISO\u DATE
进行中建议的格式设置。

非常好。它向您展示了使用java.time类的现代方法,而不是麻烦的旧式日期时间类(
date
&
Calendar

MonthDay
我将通过添加一个想法来扩展这个答案:您可以将您输入的月号和缩写月名表示为一个对象

要了解这里的
DayeTimeFormatterBuilder
的用法,请参阅另一个

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格式。您的格式是“基本”版本,最大限度地减少了分隔符的使用。此格式已在中定义

20110811


2011年8月14日
是日期字符串还是日期对象?该示例没有线程问题。如果您决定将格式化程序作为实例字段,而不是局部变量,那么请注意线程安全。您可以使用ThreadLocal(常用做法)@MichałNiklas,这是正确的,但它不是需求的一部分(或者至少我不知道它是否是):)当然是一个不错的选择。我想我更喜欢它而不是我自己的。一个原因是这一年比根据日期选择年份更好。仅举一个例子,可能有一项要求,即日期必须在今后6个月内;从
MonthDay
@OleV.V验证和计算正确的年份要容易得多。我的答案是你的延伸,而不是另一个选择。您给出了使用格式化程序生成器解析非标准输入的很好的解释和示例。
String input = "11aug" ;
DateTimeFormatter f = 
    new DateTimeFormatterBuilder()  
        .parseCaseInsensitive()
        .appendPattern( "ddMMM" )
        .toFormatter( Locale.ENGLISH )
;
MonthDay md = MonthDay.parse( input , f ) ;
LocalDate ld = md.atYear( 2011 ) ; 
String output = ld.format( DateTimeFormatter.BASIC_ISO_DATE ) ;