簡體   English   中英

Java簡單日期格式-dd / MM / yy v / s dd / MM / yyyy

[英]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類一起使用。

因此,我建議您將過時的類SimpleDateFormatDate放在肩膀上。 對於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)。 用小寫表示年份,即uuyy (不是大寫的YY ,它表示基於周的年份,僅對星期編號有用)。 順便說一句,再次SimpleDateFormat讓你擺脫這些錯誤,有時為您提供不正確的結果; 現代類將通過拋出異常來反對。
  • 我的代碼將解析為從2000年到2099年的一年。請檢查這是否是您想要的。 您可能希望施加其他限制,例如,日期時間應該在過去且不超過5年,以增強驗證。 你比我更了解。

轉換為目標格式:

    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.

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