簡體   English   中英

使用 SimpleDateFormat.parse() 時獲取錯誤數據

[英]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

看這里:

java.時間

問題和現有答案使用SimpleDateFormat ,這是 2012 年的正確做法。2014 年 3 月, java.util日期時間 API 及其格式 API, SimpleDateFormat現代日期時間 API 取代 從那時起,強烈建議停止使用舊版日期時間 API。

使用現代日期時間 API 的解決方案:正如您可以從文檔中了解到的那樣,符號Y用於基於周的年份,而在這種情況下我們需要y年份)。 但是,我更喜歡uy

請注意,您的日期時間字符串只有日期和時間單位(沒有時區或時區偏移量等)。 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 的更多信息。


注意:檢查此答案此答案以了解如何將java.time API 與 JDBC 一起使用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM