[英]DateTimeFormatter unable to parse a Date String but SimpleDateFormat is able to
[英]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-05
和2012-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 8及更高版本中。 這些類取代了麻煩的舊日期時間類,例如java.util.Date
, .Calendar
和java.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.