package xin.glue.user.common; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; public class DateUtils { public static final int MILLIS_PER_SECOND = 1000; public static final int MILLIS_PER_MINUTE = 1000 * 60; public static final int MILLIS_PER_DAY = 1000 * 60 * 60 * 24; public static final String DEFAULT_DATE_FORMAT = "yyyyMMddHHmmss"; private DateUtils() { } /** * 디폴트 DateFormat(yyyyMMddHHmmss)을 사용하여 입력된 날자를 연산한 후 * Date String을 리턴한다. * * 예제> getStringDateAddedTime("20081120132215", 0,0,0,25) -> "20081120132240" * getStringDateAddedTime("20081120132215", 1,0,0,0) -> "20081121132215" * getStringDateAddedTime("20081120132215", 0,2,0,0) -> "20081120152215" * getStringDateAddedTime("20081120132215", 0,0,30,0) -> "20081120135215" * * @param date 날자 * @param day 일 * @param hour 시간 * @param min 분 * @param sec 초 * @return 연산된 Date String * @see java.text.SimpleDateFormat */ public static String getStringDateAddedTime(String date, int day, int hour, int min, int sec) { return getStringDateAddedTime(date, DEFAULT_DATE_FORMAT, day, hour, min, sec); } /** * 날자를 연산하여 주어진 DateFormat 에 맞도록 String을 리턴함. * * * @param date 날자 * @param format Date Format (예, yyyyMMddHHmmss) * @param day 일 * @param hour 시간 * @param min 분 * @param sec 초 * @return 연산된 Date String * @see java.text.SimpleDateFormat */ public static String getStringDateAddedTime(String date, String format, int day, int hour, int min, int sec) { SimpleDateFormat sdf = new SimpleDateFormat(format); Date dateObj = null; try { dateObj = sdf.parse(date); } catch (ParseException pe) { throw new RuntimeException( "Cannot convert StringDate - " + pe.getMessage(), pe); } Calendar calendar = Calendar.getInstance(); calendar.setTime(dateObj); calendar.add(Calendar.DATE, day); calendar.add(Calendar.HOUR, hour); calendar.add(Calendar.MINUTE, min); calendar.add(Calendar.SECOND, sec); return sdf.format(calendar.getTime()); } /** * 입력 된 두 시각 차이의 차이를 초(second)로 리턴한다. * 입력 포맷은 디폴트 포맷이어야 한다. * (예, yyyyMMddHHmmss) * * @param startDay yyyyMMddHHmmss의 날자 String * @param endDay yyyyMMddHHmmss의 날자 String * @return 두 시각 차이 (초 단위) */ public static long getDurationBySeconds(String startDay, String endDay) { return getDuration(startDay, endDay) / MILLIS_PER_SECOND; } /** * 입력 된 두 시각 차이의 차이를 분(minute)으로 리턴한다. * 입력 포맷은 디폴트 포맷이어야 한다. * (예, yyyyMMddHHmmss) * * @param startDay yyyyMMddHHmmss의 날자 String * @param endDay yyyyMMddHHmmss의 날자 String * @return 두 시각 차이 (분 단위) */ public static int getDurationByMinute(String startDay, String endDay) { long duration = getDuration(startDay, endDay) / MILLIS_PER_MINUTE; Long mins = new Long(duration); return mins.intValue(); } /** * 입력 된 두 시각 차이의 차이를 일(day)로 리턴한다. * 입력 포맷은 디폴트 포맷이어야 한다. * (예, yyyyMMddHHmmss) * * @param startDay yyyyMMddHHmmss의 날자 String * @param endDay yyyyMMddHHmmss의 날자 String * @return 두 시각 차이 (일 단위) */ public static int getDurationByDay(String startDay, String endDay) { long duration = getDuration(startDay, endDay) / MILLIS_PER_DAY; Long days = new Long(duration); return days.intValue(); } private static long getDuration(String startDay, String endDay) { SimpleDateFormat sdf = new SimpleDateFormat(DEFAULT_DATE_FORMAT); Date start = null; Date end = null; try { start = sdf.parse(startDay); end = sdf.parse(endDay); } catch (ParseException pe) { throw new RuntimeException( "Cannot convert StringDate - " + pe.getMessage(), pe); } long duration = end.getTime() - start.getTime(); if (duration <0L) duration = duration * -1; return duration; } public static void main(String[] args) { try { //String result = DateUtils.getStringDateAddedTime("20081101121229", // 0, 0, 20, 2); //System.out.println(result); //System.out.println(getDurationBySeconds("20081101121229", "20091101121835")); System.out.println(getDurationByMinute("20081101121229", "20081101121329")); //System.out.println(getDurationByDay("20081101121229", "20091121121229")); } catch (Exception e) { e.printStackTrace(); } } }