Каков наилучший способ увеличить Java.sql.date / time? - PullRequest
4 голосов
/ 04 июня 2010

У меня проблема с базой данных MySQL, в которой даты и время хранятся в отдельных столбцах. Однако в коде Java мне нужно увеличить полученную метку времени для даты и времени из базы данных на минуты, часы или дни и затем обновить соответствующие столбцы в базе данных.

В настоящее время я использую типы 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;
}

Но предпочел бы что-нибудь менее примитивное.

Спасибо

Мистер Морган

Ответы [ 2 ]

3 голосов
/ 04 июня 2010

Вы можете использовать время Joda. Затем вы можете использовать DateTime's 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 представляет количество миллисекунд с полуночи.

1 голос
/ 05 июня 2010

Вот оптимизация, при условии, что входное значение равно 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 по предмету . Тем не менее, в соответствии с 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;
}

Разница, по общему признанию, не шокирующая, но она также имеет больше преимуществ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...