增加Java.sql.date / time的最佳方法是什么?

时间:2010-06-04 19:51:03

标签: java sql date time

我有一个问题,我有一个MySQL数据库,在不同的列中存储日期和时间。但是,在Java代码中,我需要将数据库中的日期和时间的结果时间戳递增几分钟,几小时或几天,然后更新数据库中的相应列。

我目前在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;
}

但是更喜欢不太原始的东西。

由于

摩根先生

2 个答案:

答案 0 :(得分:3)

你可以使用Joda时间。然后,您可以使用DateTime的plusHoursplusDaysplusWeeks。对于解析,有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表示自午夜以来的毫秒数。

答案 1 :(得分: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,您应该可以在switchString


我非常同意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;
}

这种差异无疑是令人震惊的,但它也有更多的优势。