2014-07-13 30 views
-1

我有以下日期時間:分裂週期分爲日部分在java

Start: 2013-1-1 00:00:00.000 
End: 2013-1-31 23:59:59.599 

我如何拆分零件詮釋時期爲給天期間。

例如,如果天= 1:

2013-1-1 00:00:00.000-> 01-01-2013 23:59:59 
2013-1-2 00:00:00.000 -> 2013-1-2 23:59:59 
2013-1-3 00:00:00.000 -> 2013-1-3 23:59:59 
etc... 

我讀的C#這篇文章Split period into month parts我嘗試做這樣:

private static ArrayList<Period> splitPeriods(int days){ 
     ArrayList<Period> list = new ArrayList<>(); 
     java.sql.Timestamp start = new Timestamp(110, 0, 1, 00, 00, 00, 00); 
     java.sql.Timestamp end = new Timestamp( 110, 2, 1, 00, 00, 00, 00); 
     Timestamp current = start; 
     Period period; 
     while(current.before(end)){ 
      period = new Period(); 
      period.setStart(current); 
      current.setDate((current.getDate()+days));  
      period.setEnd(current); 

      System.out.println(period.getStart() +"\t"+period.getEnd()); 

     } 
     return list; 
    } 

集體訴訟期:

public class Period { 

    private java.sql.Timestamp end; 
    private java.sql.Timestamp start; 

//..set - get 
} 

但期間的輸出是:

2013-1-2 00:00:00.000 -> 2013-1-2 00:00:00.000 
2013-1-3 00:00:00.000 -> 2013-1-3 00:00:00.000 
etc... 

任何想法?

+0

你檢查'java.text.DateFormat'和'java.text.SimpleDateFormat'。實際上,你甚至可以使用google來將字符串轉換爲日期嗎? – SJuan76

+0

我已經檢查過,但我不明白我在哪裏可以使用它... – Jimmysnn

+0

SJuan76你可以在我的答案中看到解決方案。 java.text.DateFormat和java.text.SimpleDateFormat不解決此問題。所以你可以谷歌.... !!! – Jimmysnn

回答

1

我找到了解決方案。 Ι爲開始階段和結束階段創建新的時間戳。 開始時間段取值爲增量前的當前時間戳。 結束期間取增量後的當前時間戳的值。

代碼:

時期類

public class Period { 

    private java.sql.Timestamp end; 
    private java.sql.Timestamp start; 

//..set - get 
} 



Main類

public class MainClass{ 


    public static void main(String[] args) { 
     ArrayList<Period> list = splitPeriods(15); 

    } 

private static ArrayList<Period> splitPeriods(int days){ 
     ArrayList<Period> list = new ArrayList<>(); 
     java.sql.Timestamp start = new Timestamp(110, 2, 1, 00, 00, 00, 00); //start 1 March 2010 
     java.sql.Timestamp end = new Timestamp( 110, 3, 30, 00, 00, 00, 00); //end 30 April 2010 
     Timestamp current = start; 
     Period period; 
     while(current.before(end)){ 
      period = new Period(); 
      //new timestamp for start Period 
      java.sql.Timestamp startPeriod = new Timestamp(current.getTime()); 
      //change current timestamp 
      current.setDate((current.getDate()+days));  

      //new timestamp for end period. 
      //set prev day and time 23:59:59... 
      java.sql.Timestamp endPeriod = new Timestamp(current.getTime()); 
      endPeriod.setDate(endPeriod.getDate()-1); 
      endPeriod.setHours(23); 
      endPeriod.setMinutes(59); 
      endPeriod.setSeconds(59); 
      endPeriod.setNanos(599999999); 

      //add to list 
      period.setStart(startPeriod); 
      period.setEnd(endPeriod); 

      System.out.println(period.getStart() +"\t"+period.getEnd()); 

     } 
     return list; 
    } 
} 



結果:

input 
start: 1 March 2010 
end: 30 April 2010 


output 
2010-03-01 00:00:00.0 2010-03-15 23:59:59.599999999 
2010-03-16 00:00:00.0 2010-03-30 23:59:59.599999999 
2010-03-31 00:00:00.0 2010-04-14 23:59:59.599999999 
2010-04-15 00:00:00.0 2010-04-29 23:59:59.599999999 
0

這是一個棘手的正則表達式問題!我認爲這個困難應該被看作是正則表達式可能不是這個工作最好的工具的證據。

隨着激活multiline flag,這個正則表達式的工作原理:

  • 查找內容:Start: ([0-9]{4}(?:-[0-9]{1,2}){2} +(?:[0-9]{2}:){2}[0-9]{2})(?:\.[0-9]{2,3})?\nEnd: ([0-9]{4}(?:-[0-9]{1,2}){2} +(?:[0-9]{2}:){2}[0-9]{2})(?:\.[0-9]{2,3})?\n
  • 替換:$1 -> $2
  • 試試:http://regex101.com/r/lQ0wR9/1

自由間隔:

  • Start: ([0-9]{4}Start,(開始捕獲基團),4位數字
  • (: - [0-9] {1,2}){2} +`:後跟兩個數字破折號(兩次
  • 然後兩個數字冒號( 兩次),接着兩個數字
  • (?:\.[0-9]{2,3})?
  • (?:[0-9]{2}:){2}[0-9]{2})可選:斑點,隨後兩或三個數字
  • \r\n:新行
  • End: ...End隨後在相同的正則表達式作爲後Start

輸入:

Start: 2013-1-1 00:00:00.000 
End: 2013-1-31 23:59:59.59 
Start: 2013-1-1 00:00:00.000 
End: 2013-1-1 23:59:59 
Start: 2013-1-2 00:00:00.000 
End: 2013-1-2 23:59:59 
Start: 2013-1-3 00:00:00.000 
End: 2013-1-3 23:59:59 

的Java:

import java.util.regex.Matcher; 
    import java.util.regex.Pattern; 
public class StartEndDateLinesToArrowSingleLine { 
    private static final String LINE_SEP = System.getProperty("line.separator", "\r\n"); 
    public static final void main(String[] ignored) { 

     String regexMain = "([0-9]{4}(?:-[0-9]{1,2}){2} +" + 
     "(?:[0-9]{2}:){2}[0-9]{2})" + 
     "(?:\\.[0-9]{2,3})?" + LINE_SEP; 
     String findWhatRegex = "Start: " + regexMain + "End: " + regexMain; 
     String rplcWith = "$1 -> $2"; 

     String input = new StringBuilder(). 
     append("Start: 2013-1-1 00:00:00.000").append(LINE_SEP). 
     append("End: 2013-1-31 23:59:59.599").append(LINE_SEP). 
     append("Start: 2013-1-1 00:00:00.000").append(LINE_SEP). 
     append("End: 2013-1-1 23:59:59" ).append(LINE_SEP). 
     append("Start: 2013-1-2 00:00:00.000").append(LINE_SEP). 
     append("End: 2013-1-2 23:59:59" ).append(LINE_SEP). 
     append("Start: 2013-1-3 00:00:00.000").append(LINE_SEP). 
     append("End: 2013-1-3 23:59:59" ).append(LINE_SEP).toString(); 

     Matcher mtchr = Pattern.compile(findWhatRegex, Pattern.MULTILINE).matcher(input); 

     StringBuffer bfr = new StringBuffer(); 
     while(mtchr.find()) { 
     bfr.setLength(0); 
     mtchr.appendReplacement(bfr, rplcWith); 
     bfr.append(LINE_SEP); 
     mtchr.appendTail(bfr); 
     mtchr.reset(bfr.toString()); 
     } 
     System.out.println(bfr.toString()); 
    } 
} 

輸出:

2013-1-1 00:00:00 -> 2013-1-31 23:59:59 
2013-1-1 00:00:00 -> 2013-1-1 23:59:59 
2013-1-2 00:00:00 -> 2013-1-2 23:59:59 
2013-1-3 00:00:00 -> 2013-1-3 23:59:59 
+0

感謝您的回答,但我需要使用時間戳。如果我有很多年的時間戳,這種方法不起作用... – Jimmysnn

0
private List<DaySlot> getDaySlots(Date start, Date end) { 
    List<DaySlot> ret = new ArrayList<>(); 
    Date current = start; 
    while(current.before(end)) { 
     Date startOfTheDay = getStartOfTheDay(current); 
     Date endOfTheDay = getEndOfTheDay(startOfTheDay); 
     ret.add(new DaySlot(current, endOfTheDay.before(end)? endOfTheDay: end)); 
     current = getNextDay(startOfTheDay); 
    } 
    return ret; 
} 



private LocalDate getDateOnly(Date date) { 
    return date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate(); 
} 

private Date getStartOfTheDay(Date current) { 
    return Date.from(getDateOnly(current).atStartOfDay(ZoneId.systemDefault()).toInstant()); 
} 

private Date getNextDay(Date startOftheDay) { 
    Calendar calendar = Calendar.getInstance(); 
    calendar.setTime(startOftheDay); 
    calendar.add(Calendar.DATE, 1); 
    System.out.println(calendar.getTime()); 
    return calendar.getTime(); 
} 

private Date getEndOfTheDay(Date startOftheDay) { 
    Calendar calendar = Calendar.getInstance(); 
    calendar.setTime(startOftheDay); 
    calendar.add(Calendar.HOUR_OF_DAY, 23); 
    calendar.add(Calendar.MINUTE, 59); 
    calendar.add(Calendar.SECOND, 59); 
    calendar.add(Calendar.MILLISECOND, 599); 
    System.out.println(calendar.getTime()); 
    return calendar.getTime(); 
} 

的調用看起來象下面這樣:

List<DaySlot> daySlots = getDaySlots(durationStartTime, durationEndTime);