2010-06-04 2 views
4

У меня проблема, когда у меня есть база данных MySQL, хранящая даты и время в отдельных столбцах. Тем не менее, в Java-коде мне нужно увеличить полученную временную метку для даты и времени из базы данных на минуты, часы или дни, а затем обновить соответствующие столбцы в базе данных.Каков наилучший способ увеличить Java.sql.date/time?

В настоящее время я использую Java.sql.date и java.sql.time типы в Java. Может ли кто-нибудь предложить лучший метод для этого?

я могу достичь выше следующим:

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

Вы можете использовать Joda время. Затем вы можете использовать DateTime plusHours, plusDays и plusWeeks. Для синтаксического анализа есть DateTimeFormat и DateTimeFormatter. Что-то вроде:

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

Мне это нравится. Возможно ли, однако, заменить переменную timestampin на фактические переменные sql.date Java и Java.sql.time? Я хотел бы исключить преобразование в строку, а затем из строки в конце. –

+0

Или используйте тестирование подстроки для пространства, которое я делаю в настоящее время. –

1

Вот оптимизация, предполагая, что вход java.util.Date, в котором вы можете просто пройти java.sql.Date и java.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, вы должны быть в состоянии switch на String.


я бы сильно согласовывают 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. И вместо строки для приращения будет использоваться перечисление. Спасибо вам обоим! –

Смежные вопросы