2017-10-16 794 views
-1

我正在使用卡的到期日期。我有一个API,我将在“yyMM”格式中将过期日期设为“字符串”。在这里,我试图用如何使用SimpleDateFormat解析日期只有月份和年份

的SimpleDateFormat与TimeZone.getTimeZone( “UTC”)

所以我的代码是这样

String a= "2011"; 
SimpleDateFormat formatter = new SimpleDateFormat("yyMM"); 
formatter.setTimeZone(TimeZone.getTimeZone("UTC")); 
Date date = formatter.parse(a); 
System.out.println(date); 

现在的问题是,当我路过2011它给出的是Sat Oct 31 17:00:00 PDT 2020

在这里,你可以看到我通过为月,但它是转变去它10月而不是11月

为什么

我还可以使用其他选项将字符串yyMM转换为带有时区的日期?

+0

为什么问题说'MMyy',但代码是'yyMM'? java.util.Date类自1970年1月1日起将日期/时间存储为毫秒。它没有时区的概念,所以当你调用'toString()',就像'print()'调用隐式完成的那样,它将使用**默认时区**格式化该值,这明显地是你的“PDT”。如果你想要别的东西,可以使用带有明确指定的'TimeZone'的'SimpleDateFormat'。 – Andreas

+5

您应该使用Java 8 ['YearMonth'](https://docs.oracle.com/javase/8/docs/api/java/time/YearMonth.html)类。 – Andreas

+0

您的解析是正确的。当你打印Date对象时,你会隐式地调用它的'toString'方法,这又会给你提供不正确的输出。这是许多跳过“Date”和“SimpleDateFormat”类的过期案例。而是使用称为java.time或JSR-310的现代Java日期和时间API。 –

回答

4

您解析这很好,但它印在PDT,你的本地时区。

Sat Oct 31 17:00:00 PDT 2020 

那么,日期不跟踪时区。 Calendar类确实是格式化程序的内部类。但是,默认打印行为仍然是当前时区。

如果您将此输出逻辑转换回UTC,并且由于PDT是UTC-7,它将是11月1日。

基本上,使用java.time类。在此处查看其他信息How can I get the current date and time in UTC or GMT in Java?

+0

*“SimpleDateFormat不跟踪时区”*?它肯定会:['DateFormat.setTimeZone(TimeZone zone)'](https://docs.oracle.com/javase/8/docs/api/java/text/DateFormat.html#setTimeZone-java.util.TimeZone - )。 – Andreas

+0

@Andreas'日历类'确实如此。 –

+0

是的:['Calendar.setTimeZone(TimeZone value)'](https://docs.oracle.com/javase/8/docs/api/java/util/Calendar.html#setTimeZone-java.util.TimeZone - )---但你的答案是关于'SimpleDateFormat',它也支持时区,正如我已经提到的。 – Andreas

5

您应该使用Java 8 YearMonth类。

String a = "2011"; 
DateTimeFormatter inputFormat = DateTimeFormatter.ofPattern("yyMM"); 
YearMonth yearMonth = YearMonth.parse(a, inputFormat); 

DateTimeFormatter outputFormat = DateTimeFormatter.ofPattern("MMMM yyyy"); 
System.out.println(yearMonth.format(outputFormat)); 

输出

November 2020

+0

Java 8仍然非常新,但还不是标准 - 我的建议是在可能的情况下坚持更好的支持日期格式。 –

+5

@DerekBrown Java 8于2014年3月18日发布。在3.5年前什么样的编程世界“真正新”,以及“它还没有成为标准”的方式? [Java 7在2015年4月被终止](https://www.java.com/en/download/faq/java_7.xml),所以Java 8是最早的维护版本。现在Java 9甚至已经发布了,所以你离开了商标。 – Andreas

+4

@DerekBrown *没有*理由坚持现在已有的可怕的旧日期时间类,几年前由java.time类取代。那些旧的类是一个可怜的混乱,不会造成混乱和痛苦,因为任何快速搜索Stack Overflow都会显示。对于旧版Java,Java 6和Java 7,请使用后端项目:[**​​ ThreeTen-Backport ***](http://www.threeten.org/threetenbp/)。 –

相关问题