2017-10-16 157 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/)。 –

相關問題