2010-06-04 92 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

相关问题