簡體   English   中英

Java:SimpleDateFormat-無法將字符串解析為所需格式的日期

[英]Java : SimpleDateFormat - Unable to parse a string to a date of desired format

我正在嘗試將一個字符串解析為yyyy-MM-dd格式,將一個字符串解析為yyyy-MM-dd HH:mm:ss 我正在使用SimpleDateFormat

我之前已經成功使用了相同的方法,但是現在出了點問題。 我以標准格式獲取日期,即Tue Mar 05 00:00:00 GMT+05:30 2012 (用於yyyy-MM-dd )和Mon Mar 05 13:01:35 GMT+05:30 2012 (用於yyyy-MM-dd HH:mm:ss ),我需要分別將它們設置為2012-03-052012-03-05 13:01:35

這就是我要做的:

Date today = new Date();
SimpleDateFormat tsdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
try {
    today = tsdf.parse(tsdf.format(new Date()));
} catch(Exception e) {
    System.out.println("Error occurred"+ e.getMessage());
}

System.out.println(today);

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
try {
    // I recieve a string in this format here (refers to 5 march 2012).
    myDate = sdf.parse('2012-03-05');            
    System.out.println(myDate);
} catch(Exception e) {
    System.out.println("Error occurred "+ e.getMessage());
}

您不是在輸出格式化程序結果的字符串,而是在輸出實際的日期對象。 這將始終是Date.toString()的結果,對於您正在使用的JDK,它就是您所看到的格式。 不要將格式化的String轉換回日期對象,只需將其打印出來即可!

SimpleDateFormat tsdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
try {
    String formattedDate = tsdf.format(new Date());
} catch(Exception e) {
    System.out.println("Error occurred"+ e.getMessage());
}

System.out.println(formattedDate);

您不能將“格式”應用於java.util.Date對象以供以后使用。 它僅是原始的毫秒數,其toString方法將始終打印相同的表示形式。 您必須將其轉換為格式化的字符串並使用該字符串。

today = tsdf.parse(tsdf.format(new Date()));
System.out.println(today);

像您期望的那樣,對我來說, Date實例已格式化 事實並非如此。 Date實例表示可以格式化為字符串的日期。 這是一個僅包含一個long值的類(意思是類似“毫秒時間”的東西)。

這將產生預期的結果:

Date today = new Date();
String formattedDate = tsdf.format(today);
System.println(formattedDate);     // <- we print the string!!

java.time

您正在使用java.time類取代的麻煩的舊日期時間類。

java.time框架內置於Java 8及更高版本中。 這些類取代了麻煩的舊日期時間類,例如java.util.Date.Calendarjava.text.SimpleDateFormat Joda-Time小組還建議遷移到java.time。

要了解更多信息,請參見Oracle教程 並在Stack Overflow中搜索許多示例和說明。

多的java.time功能后移植到Java 6和7在ThreeTen-反向移植並且還適於在到Android ThreeTenABP

LocalDate

對於僅日期值,請使用LocalDate類。 您的輸入值為標准ISO 8601格式。 在java.time類中,默認情況下使用ISO 8601格式來解析和生成表示日期時間值的字符串。 因此,無需指定格式化模式。

LocalDate localDate = LocalDate.parse( "2012-03-05" );

要生成這樣的字符串,請調用toString

String output = localDate.toString();

LocalDateTime

對於諸如2012-03-05 12:34:56類的字符串,我們有問題。 沒有指示從UTC偏移或時區。 因此,它並不代表時間軸上的實際時刻,而是有關可能時刻的粗略想法。 此非關鍵時刻由LocalDateTime類在java.time中表示。

您的字符串格式是ISO 8601的一種變體,而規范版本的中間是T ,而不是空格。 因此,一種選擇是用更換SPACE T

LocalDateTime ldt = LocalDateTime.parse( "2012-03-05 12:34:56".replace( " " , "T" );

或定義一個模式。

DateTimeFormatter formatter = DateTimeFormatter.ofPattern( "yyyy-MM-dd hh:mm:ss" );
LocalDateTime ldt = LocalDateTime.parse( "2012-03-05 12:34:56" , formatter );

如果確實要表示時間軸上的實際時刻,請避免使用缺少偏移或時區信息的日期時間格式。

ZonedDateTime

為了賦予該值含義,以確定時間軸上的實際時刻,我們需要分配打算使用日期時間的時區。

ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ldt.atZone( zoneId );

調用toString生成一個格式為String的字符串,該格式通過將時區的名稱附加在方括號中來擴展ISO 8601標准格式。

String output = zdt.toString(); // Yields: 2012-03-05T12:34:56-04:00[America/Montreal]

如果要省略T ,則可以使用String::replace方法將其替換為SPACE。 或使用格式化程序。 如果您確實想要“問題”中所見的缺少任何偏移量或時區信息的字符串(違反我的建議),請使用上面顯示的相同格式器。

DateTimeFormatter formatter = DateTimeFormatter.ofPattern( "yyyy-MM-dd hh:mm:ss" );  // Not recommended as it lacks offset/zone info.
String output = zdt.format( formatter );  // Yields: 2012-03-05 12:34:56

如果要格式化Date實例,則不必使用parse方法,而必須使用format方法,如下所示:

    Date today = new Date();
    SimpleDateFormat tsdf = new SimpleDateFormat("yyyy-MM-dd");
    try
    {
        System.out.println(tsdf.format(today));
    }
    catch (Exception e)
    {
        System.out.println("Error occurred" + e.getMessage());
    }

parse方法用於將字符串轉換為日期, format方法用於將Date實例按指定格式格式化為字符串。

暫無
暫無

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

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