2010-06-04 87 views
4

我有一個問題,我有一個MySQL數據庫存儲日期和時間在單獨的列。但是,在Java代碼中,我需要從數據庫中以分鐘,小時或天計算日期和時間的結果時間戳,然後更新數據庫中的相應列。增加Java.sql.date/time的最佳方法是什麼?

我目前在Java中使用Java.sql.date和java.sql.time類型。任何人都可以爲此提出最佳方法嗎?

我可以通過以下實現上述:

public static String addToDateTime(String timestampIn, String increment) { 

    // Decompose timestamp. 
    int year = Integer.parseInt(timestampIn.substring(0, 4)); 
    int month = Integer.parseInt(timestampIn.substring(5, 7)); 
    int day = Integer.parseInt(timestampIn.substring(8, 10)); 
    int hours = Integer.parseInt(timestampIn.substring(11, 13)); 
    int mins = Integer.parseInt(timestampIn.substring(14, 16)); 
    int secs = Integer.parseInt(timestampIn.substring(17, 19)); 

    Calendar calendar = new GregorianCalendar(year, month - 1, day, hours, mins, secs); 

    // Increment timestamp. 
    if (increment.equals("HOURLY")) { 
     calendar.add(Calendar.HOUR, 1); 
    } 
    else if (increment.equals("DAILY")) { 
     calendar.add(Calendar.HOUR, 24); 
    } 
    else if (increment.equals("WEEKLY")) { 
     calendar.add(Calendar.HOUR, 168); 
    } 
    else if (increment.equals("DO NOT POLL")) { 

     // Do nothing. 

    } 

    // Compose new timestamp. 
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
    String timestampOut = sdf.format(calendar.getTime()); 
    return timestampOut; 
} 

但寧可少一些原始。

感謝

摩根先生

回答

3

可以使用喬達時間。然後,您可以使用DateTime的plusHours,plusDaysplusWeeks。對於解析,有DateTimeFormatDateTimeFormatter。喜歡的東西:

DateTimeFormatter fmt = DateTimeFormat.forPattern("YYYY-MM-dd HH:mm:ss"); 
DateTime dt = fmt.parseDateTime(timestampin); 

if (increment.equals("HOURLY")) { 
    dt = dt.plusHours(1); 
} 
else if (increment.equals("DAILY")) { 
    dt = dt.plusDays(1); 
} 
else if (increment.equals("WEEKLY")) { 
    dt = dt.plusWeeks(1); 
} 

String timestampOut = fmt.print(dt); 

你或許可以使用類似:

DateTime dt = new DateMidnight(sqlDate).plus(Period.millis(sqlTime.getTime())); 

即假定sql.Time代表午夜以來的毫秒數。

+0

我喜歡這個。雖然可以用實際的Java sql.date和Java.sql.time變量替換變量timestampin嗎?我想消除轉換爲字符串,然後從字符串結束。 – 2010-06-04 20:16:10

+0

或者對目前我做的空間使用子串測試。 – 2010-06-04 20:39:30

1

這是一個優化,假設輸入爲java.util.Date,其中您可以傳遞java.sql.Datejava.sql.Time,因爲它們只是它的子類。

public static String addToDateTime(Date date, Increment increment) throws ParseException { 
    Calendar calendar = calendar.getInstance(); 
    calendar.clear(); 
    calendar.setTime(date); 

    switch (increment) { 
     case HOURLY: calendar.add(Calendar.HOUR, 1); break; 
     case DAILY: calendar.add(Calendar.DATE, 1); break; 
     case WEEKLY: calendar.add(Calendar.WEEK_OF_YEAR, 1); break; 
     case DO_NOT_POLL: break; 
    } 

    return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(calendar.getTime()); 
} 

public enum Increment { 
    HOURLY, DAILY, WEEKLY, DO_NOT_POLL; 
} 

可以用來作爲

String newTimestamp = addToDateTime(timestampIn, Increment.WEEKLY); 

要了解更多的有用enum,檢查Sun tutorial on the subject。但是,按照Java 7,您應該能夠在String上獲得switch


然而,我強烈同意JodaTime諮詢,這裏有一個例子:

public static String addToDateTime(Date date, Increment increment) { 
    DateTime dt = new DateTime(date); 

    switch (increment) { 
     case HOURLY: dt = dt.plusHours(1); break; 
     case DAILY: dt = dt.plusDays(1); break; 
     case WEEKLY: dt = dt.plusWeeks(1); break; 
     case DO_NOT_POLL: break; 
    } 

    return df.print(dt); 
} 

public enum Increment { 
    HOURLY, DAILY, WEEKLY, DO_NOT_POLL; 
} 

的區別是無可否認不令人震驚,但它具有更多的優勢。

+0

這些都是很好的解決方案,我已經得到了JodaTime的工作。並且將使用枚舉來代替增量的字符串。感謝你們倆! – 2010-06-04 20:31:06

相關問題