Java SimpleDateFormat 解析时忽略月份

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/3056703/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-13 16:03:14  来源:igfitidea点击:

SimpleDateFormat ignoring month when parsing

javasimpledateformat

提问by manu

The following code is giving me the parsed date as "Wed Jan 13 00:00:00 EST 2010" instead of "Wed Jun 13 00:00:00 EST 2010". Any ideas much appreciated.

以下代码为我提供了解析日期为“Wed Jan 13 00:00:00 EST 2010”而不是“Wed Jun 13 00:00:00 EST 2010”。任何想法都非常感谢。

    SimpleDateFormat sf = new SimpleDateFormat("yyyy-mm-dd'T'HH:mm:ss");

    String str = "2010-06-13T00:00:00";

    Date date = sf.parse(str);

    System.out.println(" Date " + date.toString());

采纳答案by Mark Byers

Try:

尝试:

"yyyy-MM-dd'T'HH:mm:ss"

MMmeans month. mmmeans minutes. See the documentation for SimpleDateFormatfor more details of the supported date and time patterns.

MM表示月份。mm表示分钟。有关SimpleDateFormat支持的日期和时间模式的更多详细信息,请参阅文档。

回答by heloisasim

The problem is that you're using 'mm' as month and 'mm' represents minutes. Below is all date formats available, read more doc here.

问题是您使用 'mm' 作为月份,而 'mm' 代表分钟。以下是所有可用的日期格式,请在此处阅读更多文档。

Symbol  Meaning                Kind         Example
D       day in year             Number        189
E       day of week             Text          E/EE/EEE:Tue, EEEE:Tuesday, EEEEE:T
F       day of week in month    Number        2 (2nd Wed in July)
G       era designator          Text          AD
H       hour in day (0-23)      Number        0
K       hour in am/pm (0-11)    Number        0
L       stand-alone month       Text          L:1 LL:01 LLL:Jan LLLL:January LLLLL:J
M       month in year           Text          M:1 MM:01 MMM:Jan MMMM:January MMMMM:J
S       fractional seconds      Number        978
W       week in month           Number        2
Z       time zone (RFC 822)     Time Zone     Z/ZZ/ZZZ:-0800 ZZZZ:GMT-08:00 ZZZZZ:-08:00
a       am/pm marker            Text          PM
c       stand-alone day of week Text          c/cc/ccc:Tue, cccc:Tuesday, ccccc:T
d       day in month            Number        10
h       hour in am/pm (1-12)    Number        12
k       hour in day (1-24)      Number        24
m       minute in hour          Number        30
s       second in minute        Number        55
w       week in year            Number        27
G       era designator          Text          AD
y       year                    Number        yy:10 y/yyy/yyyy:2010
z       time zone               Time Zone     z/zz/zzz:PST zzzz:Pacific Standard 

回答by Noorul

Example if Date is 06 07 2016

日期为 06 07 2016 的示例

SimpleDateFormat sdf= new SimpleDateFormat("dd MM yyyy");

you can use comma, full-stop, slash, or hyphen between these format.

您可以在这些格式之间使用逗号、句号、斜线或连字符。

 Ex: dd-mm-yyyy, it will display like(06-07-2016)
 dd/mm/yyyy,it will display like(06/07/2016)
 dd.mm.yyyy,it will display like(06.07.2016)
 dd,mm,yyyy ,it will display like(06,07,2016)

 MM   - will display number of the Month.
 MMM  - will display Month Three character only(Ex: Jul)
 MMMM - will display full month(Ex: July)

 yyyy - will display full year(2016) 
 yy   - will display last two digits(16)

 hh - will display hours
 mm -will display minutes
 ss - will display seconds
 a - will display AM or PM

 Ex: if time is 12:09:10 PM means (hh:mm:ss a)

 EEE- will display short week name(Ex: Wed)
 EEEE- will display full week name(Ex: Wednesday)

回答by Ole V.V.

Modern answer:

现代答案:

    String str = "2010-06-13T00:00:00";
    LocalDateTime dateTime = LocalDateTime.parse(str);
    System.out.println("Date-time " + dateTime);

Output:

输出:

Date-time 2010-06-13T00:00

日期时间 2010-06-13T00:00

I am using and recommending java.time, the modern Java date and time API. We don't even need an explicit formatter for parsing. This is because your string is in ISO 8601 format, the international standard that the java.timeclasses parse as their default. java.timecame out in 2014.

我正在使用和推荐java.time现代 Java 日期和时间 API。我们甚至不需要用于解析的显式格式化程序。这是因为您的字符串采用 ISO 8601 格式,这是java.time类解析为默认值的国际标准。java.time2014年问世。

While in 2010 when this question was asked, SimpleDateFormatwas what we had for parsing dates and times, that class is now considered long outdated, fortunately, because it was also troublesome.

虽然在 2010 年提出这个问题时,SimpleDateFormat我们有什么用于解析日期和时间,但幸运的是,该类现在被认为已经过时了,因为它也很麻烦。

In case your string contained only a datewithout time of day, use the LocalDateclass in quite the same manner (this was asked in a duplicate question).

如果你的字符串只包含一个日期没有一天的时间,用LocalDate在完全同样地类(这是在问一个重复的问题)。

    String dateStr = "2018-05-23";
    LocalDate date2 = LocalDate.parse(dateStr);
    System.out.println(date2);

2018-05-23

2018-05-23

Link:Oracle tutorial: Date Timeexplaining how to use java.time.

链接:Oracle 教程:解释如何使用java.time.