[英]Java Simple date format - dd/MM/yy v/s dd/MM/yyyy
我需要將String
解析為dd/MM/YY hh:mm:ss
格式。
假設一個String
值是09/06/17 05:59:59
那么它應該被解析,但是如果一個String
值是09/06/2017 05:59:59
那么這也是一個有效的格式,並且在我要求,稍后應引發解析異常。
碼:
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class DateDemo {
public static void main(String[] args) {
String line=" 09/06/17 05:59:59 20170609IT36701706080107 42 103 Output USD 970.20 IT3670";
//String line=" 09/06/2017 05:59:59 20170609IT36701706080107 42 103 Output USD 970.20 IT3670";
String dt=null;
dt=line.substring(1, 19);
SimpleDateFormat org_format = new SimpleDateFormat("dd/MM/YY hh:mm:ss");
SimpleDateFormat tgt_format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
try {
dt=line.substring(1, 19);
System.out.println(dt);
Date date = org_format.parse(dt);
System.out.println(date);
String tgt_date=tgt_format.format(date);
System.out.println(tgt_date);
} catch (ParseException e) {
System.out.println(line);
}
}
}
問題-在代碼中,未注釋的行變量和注釋的行變量都成功給出了結果。 但是注釋行應該拋出可解析的異常,因為它是模式dd/MM/yyyy
,而不是dd/MM/yy
。
fmt.setLenient(false)
無法正常工作。
我正在使用java.time
。沒有使用Java 8或更高版本的選項,因此不能使用java.time
。
沒有使用Java 8或更高版本的選項,因此不能使用java.time
Java 8日期和時間類已被反向移植到Java 6和7,因此可以,您可以在Java 7中使用它們。Get ThreeTen Backport 。 這也是對未來的投資:如果最終升級到Java 8或9,則只需修改import
聲明,代碼就可以與java.time
類一起使用。
因此,我建議您將過時的類SimpleDateFormat
和Date
放在肩膀上。 對於SimpleDateFormat
,在需要異常的情況下為您提供結果(通常是不正確的結果)是非常典型的。 如您所述,有時org_format.setLenient(false);
會有所幫助,但不適用於您。
使用ThreeTen Backport:
DateTimeFormatter originalFormat = DateTimeFormatter.ofPattern("dd/MM/uu HH:mm:ss");
ParsePosition pos = new ParsePosition(1); // skip leading space
LocalDateTime ldt = LocalDateTime.from(originalFormat.parse(line, pos));
這會將您的行以兩位數的年份解析為
2017-01-02 05:59:59
對於年份為4位數字的行,“在我的要求下,應引發解析異常”,我們得到
線程“主”中的異常java.time.format.DateTimeParseException:文本'09/06/2017 05:59:59 20170609IT36701706080107 42103輸出USD ...'無法在索引9處解析
它說索引9,即2017
的第17
位,也就是當年的第三位數字應該只為兩位數的位置。
需要注意的幾點:
HH
(小hh
表示AM或PM,僅適用於AM / PM marler)。 用小寫表示年份,即uu
或yy
(不是大寫的YY
,它表示基於周的年份,僅對星期編號有用)。 順便說一句,再次SimpleDateFormat
讓你擺脫這些錯誤,有時會為您提供不正確的結果; 現代類將通過拋出異常來反對。 轉換為目標格式:
DateTimeFormatter targetFormat = DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss");
String targetDate = ldt.format(targetFormat);
使用前幾行,結果是
2017-01-02 05:59:59
您可以使用正則表達式檢查year是否包含4位數字,如果是,則拋出新的ParseException。 該程序是:
public static void main(String[] args) throws ParseException {
String date = "09/06/17 05:59:59";
if (date.matches("\\d{1,2}[/.-]\\d{1,2}[/.-]\\d{4} .*"))
throw new ParseException("date has wrong format");
else {
}
}
正則表達式以匹配任何這些日期格式
String regex = "^(([0]?[1-9]|1[0-2])/([0-2]?[0-9]|3[0-1])/[1-2]\d{3}) (20|21|22|23|[0-1]?\d{1}):([0-5]?\d{1})$";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher("09/06/17 05:59:59");
if(matcher.matches()){
//your next code
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.