我有一个问题,我有一个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;
}
但是更喜欢不太原始的东西。
由于
摩根先生答案 0 :(得分: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表示自午夜以来的毫秒数。
答案 1 :(得分: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;
}
这种差异无疑是令人震惊的,但它也有更多的优势。