如何使用SimpleDateFormat解析日期只有月份和年份
我正在使用卡的到期日期。我有一个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
转换为带有时区的日期?
您解析这很好,但它印在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?
*“SimpleDateFormat不跟踪时区”*?它肯定会:['DateFormat.setTimeZone(TimeZone zone)'](https://docs.oracle.com/javase/8/docs/api/java/text/DateFormat.html#setTimeZone-java.util.TimeZone - )。 – Andreas
@Andreas'日历类'确实如此。 –
是的:['Calendar.setTimeZone(TimeZone value)'](https://docs.oracle.com/javase/8/docs/api/java/util/Calendar.html#setTimeZone-java.util.TimeZone - )---但你的答案是关于'SimpleDateFormat',它也支持时区,正如我已经提到的。 – Andreas
您应该使用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
Java 8仍然非常新,但还不是标准 - 我的建议是在可能的情况下坚持更好的支持日期格式。 –
@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
@DerekBrown *没有*理由坚持现在已有的可怕的旧日期时间类,几年前由java.time类取代。那些旧的类是一个可怜的混乱,不会造成混乱和痛苦,因为任何快速搜索Stack Overflow都会显示。对于旧版Java,Java 6和Java 7,请使用后端项目:[** ThreeTen-Backport ***](http://www.threeten.org/threetenbp/)。 –
为什么问题说'MMyy',但代码是'yyMM'? java.util.Date类自1970年1月1日起将日期/时间存储为毫秒。它没有时区的概念,所以当你调用'toString()',就像'print()'调用隐式完成的那样,它将使用**默认时区**格式化该值,这明显地是你的“PDT”。如果你想要别的东西,可以使用带有明确指定的'TimeZone'的'SimpleDateFormat'。 – Andreas
您应该使用Java 8 ['YearMonth'](https://docs.oracle.com/javase/8/docs/api/java/time/YearMonth.html)类。 – Andreas
您的解析是正确的。当你打印Date对象时,你会隐式地调用它的'toString'方法,这又会给你提供不正确的输出。这是许多跳过“Date”和“SimpleDateFormat”类的过期案例。而是使用称为java.time或JSR-310的现代Java日期和时间API。 –