[英]Getting wrong data when using SimpleDateFormat.parse()
嘗試將字符串解析為日歷時出現最奇怪的錯誤。 它似乎弄亂了我用來設置結果日歷時間的日期 object。 該錯誤非常不一致(或者我認為其中沒有邏輯)。 誰能指出我可能做錯了什么?
public class caltest{
public static final SimpleDateFormat sdf = new SimpleDateFormat("YYYY-MM-dd HH:mm:ss.SSS");
public static void main(String[] args) {
String date1 = "1992-03-11 12:00:12.123";
String date2 = "1993-03-11 12:00:12.123";
String date3 = "1994-03-11 12:00:12.123";
String date4 = "1995-03-11 12:00:12.123";
parseStringAsCalendar(date1);
parseStringAsCalendar(date2);
parseStringAsCalendar(date3);
parseStringAsCalendar(date4);
}
public static String calendarToString(Calendar cal) {
return sdf.format(cal.getTime());
}
public static Calendar parseStringAsCalendar(String s) {
Date time = null;
try {
time = sdf.parse(s);
} catch (ParseException e) {
System.out.println("Exception");
e.printStackTrace();
}
System.out.println(time.toString());
GregorianCalendar ret = new GregorianCalendar();
ret.setTime(time);
return ret;
}
}
output 是:
Sun Dec 29 12:00:12 CET 1991
Sun Dec 27 12:00:12 CET 1992
Sun Dec 26 12:00:12 CET 1993
Sun Jan 01 12:00:12 CET 1995
您在格式說明符中使用YYYY
,這是一周 (從Java 7開始,我相信)。 你想要yyyy
,這只是“年”。 (請參閱SimpleDateFormat
文檔 。)
我懷疑剩下的日期已經結束了,因為你還試圖指定月份和日期,這在一周中並不是真正的“功能”...如果你指定了“一周的一周”和一天的一周,它可能會給出一些更明智的結果,但只有你真的打算使用一周,我懷疑:)
用這個:
public static final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
它是年份的小寫y
,而不是大寫的Y
有了它,結果是:
Wed Mar 11 12:00:12 EST 1992
Thu Mar 11 12:00:12 EST 1993
Fri Mar 11 12:00:12 EST 1994
Sat Mar 11 12:00:12 EST 1995
看這里:
問題和現有答案使用SimpleDateFormat
,這是 2012 年的正確做法。2014 年 3 月, java.util
日期時間 API 及其格式 API, SimpleDateFormat
被現代日期時間 API 取代。 從那時起,強烈建議停止使用舊版日期時間 API。
使用現代日期時間 API 的解決方案:正如您可以從文檔中了解到的那樣,符號Y
用於基於周的年份,而在這種情況下我們需要y
(年份)。 但是,我更喜歡u
到y
。
請注意,您的日期時間字符串只有日期和時間單位(沒有時區或時區偏移量等)。 java.time
API 為您提供LocalDateTime
來表示這樣的 object。
如果您需要獲取帶時區的日期時間 object 或僅代表某一時刻的時間, java.time
為您提供特定類型。 您可以在此處查看java.time
類型的概述。
對於 Java java.util
date-time API 也進行了升級,以便輕松切換到java.time
API 例如,如果您需要java.util.Date
實例,則可以使用Instant
Date#from
。
演示:
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeFormatterBuilder;
import java.util.Date;
import java.util.Locale;
class Main {
public static void main(String[] args) {
String strDateTime = "1992-03-11 12:00:12.123";
DateTimeFormatter parser = DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss.SSS", Locale.ENGLISH);
// An alternative parser
DateTimeFormatter ldtParser = new DateTimeFormatterBuilder().append(DateTimeFormatter.ISO_LOCAL_DATE)
.appendLiteral(' ').append(DateTimeFormatter.ISO_LOCAL_TIME).toFormatter(Locale.ENGLISH);
LocalDateTime ldt = LocalDateTime.parse(strDateTime, parser);
System.out.println(ldt);
// Parsing using the alternative parser
ldt = LocalDateTime.parse(strDateTime, ldtParser);
System.out.println(ldt);
// Converting LocalDateTime to a ZonedDateTime
// Replace ZoneId.systemDefault() with applicable ZoneId e.g.
// ZoneId.of("America/New_York")
ZoneId zoneId = ZoneId.systemDefault();
ZonedDateTime zdt = ldt.atZone(zoneId);
System.out.println(zdt);
// Alternatively,
zdt = ZonedDateTime.of(ldt, zoneId);
System.out.println(zdt);
// Obtaining an Instant
Instant instant = zdt.toInstant();
System.out.println(instant);
// In case you need an instance of java.util.Date
Date date = Date.from(instant);
}
}
Output 在我的時區,歐洲/倫敦:
1992-03-11T12:00:12.123
1992-03-11T12:00:12.123
1992-03-11T12:00:12.123Z[Europe/London]
1992-03-11T12:00:12.123Z[Europe/London]
1992-03-11T12:00:12.123Z
從Trail:Date Time中了解有關現代日期時間 API 的更多信息。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.