【问题标题】:What is the best way to increment a Java.sql.date / time?增加 Java.sql.date / time 的最佳方法是什么?
【发布时间】:2011-02-27 23:18:39
【问题描述】:

我有一个问题,我的 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;
}

但更喜欢不那么原始的东西。

谢谢

摩根先生

【问题讨论】:

    标签: java sql date time


    【解决方案1】:

    您可以使用 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 表示自午夜以来的毫秒数。

    【讨论】:

    • 我喜欢这个。是否可以用实际的 Java sql.date 和 Java.sql.time 变量替换变量 timestampin?我想消除对字符串的转换,然后从最后的字符串中消除。
    • 或者使用我目前做的空间子串测试。
    【解决方案2】:

    这里有一个优化,假设输入是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;
    }
    

    诚然,这种差异并不令人震惊,但它也有更多的优势。

    【讨论】:

    • 这些都是很好的解决方案,我已经让 JodaTime 工作了。并且将使用枚举代替字符串进行增量。谢谢你们!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-11
    • 1970-01-01
    • 2010-09-10
    • 1970-01-01
    • 2013-08-21
    • 2011-05-20
    • 1970-01-01
    相关资源
    最近更新 更多