2015-10-24 38 views
0
日期

下面一串代碼日期轉換爲DateTime OBJ:如何排序的不同格式

import java.util.ArrayList; 
import java.util.Collections; 
import java.util.List; 

import org.joda.time.DateTime; 
import org.joda.time.format.DateTimeFormatter; 

public class SortByDate 
{ 
    // Date format is (mm/dd/yyyy) 
    private void testSort() 
    { 

     List<Obj> l = new ArrayList<Obj>(); 

     Obj o =new Obj(); 
     o.date = "1/5/2015 1:37:00"; 
     l.add(o); 
     o = new Obj(); 
     o.date = "1/5/2015 01:38:00"; 
     l.add(o); 
     o = new Obj(); 
     o.date = "1/5/2015 01:36:00"; 
     l.add(o); 
     o = new Obj(); 
     o.date = "1/5/2015"; 
     l.add(o); 


     DateTimeFormatter dtf = org.joda.time.format.DateTimeFormat.forPattern("MM/dd/yyyy HH:mm:ss"); 

     List<DateTime> dtl = new ArrayList<DateTime>(); 
     for(Obj ob : l){ 
      dtl.add(dtf.parseDateTime(ob.date)); 
     } 

     Collections.sort(dtl); 

     for(DateTime d : dtl){ 
      System.out.println(d); 
     } 
    } 

    public static void main(String args[]) 
    { 
     new SortByDate().testSort(); 
    } 

    private class Obj 
    { 
     public String date; 
    } 

} 

但我得到異常:

Exception in thread "main" java.lang.IllegalArgumentException: Invalid format: "1/5/2015" is too short 
    at org.joda.time.format.DateTimeFormatter.parseDateTime(DateTimeFormatter.java:899) 

要排序日期倒序排列,並迎合日期是沒有時間設置我打算將「23:23:59」添加到格式不正確的字符串中,因此"1/5/2015"變爲"1/5/2015 23:23:59"

是否有更多idi omatic方法處理這種情況或替代方法?

+0

我認爲有問題的行是一個其中你有沒有指定的時間。在這種情況下,我會作爲一種權宜之計附加「00:00:00」(或者如果部分提供了子字符串以完成時間字段)。我很驚訝,我可能不得不嘗試你的例子。你會認爲DateTimeFormatter會假定00:00:00有一段時間。 – clearlight

+0

等待 - 爲什麼使用org.joda.time中的DateTime和DateTimeFormatter而不是java.util。*中的東西;包。我敢打賭,Java的東西不會拋出異常。同樣奇怪的是,你們都包含了包的東西,但是在dtf定義行中指定了整個包路徑。有一個更乾淨的方法來做到這一點。 – clearlight

回答

0

「MM/dd/yyyy HH:mm:ss」是程序需要的格式。以另一種格式「MM/dd/yyyy」傳遞字符串將作爲錯誤處理。

你可以使用正則表達式檢查和不同dateformatter

if(ob.date.matches(REG_EX_FULLDATE)){ 
     // use dateFormatter1 
    } 
else if(ob.date.matches(REG_EX_SHORTDATE)){ 
    // use dateFormatter2 
} else { 
     throw new RuntimeException(); 
}