среда, октября 04, 2006

Вот так вот надо манипулировать с датой...
Дело то нехитрое. Надо взять строку и конвертнуть в дату обрезать до дней (убрать часы, минуты, секунды...) и конвертнуть из TimeZone "GMT-8" в "GMT".
Вот пример реализации такой логики:

/**
* Convert formated string from request to Date
* @param startTimeStr formated string "yyyy-MM-dd z"
* @return Date
*/

public Date getStartTime(String startTimeStr) {
    Date result = null;
    // if period parameter init
    if (startTimeStr == null) {
        // get current time in GMT
        final Calendar calStart = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
        logger.info("Current start time: " + calStart.getTime());
        calStart.set(Calendar.HOUR, 0);
        calStart.set(Calendar.MINUTE, 0);
        calStart.set(Calendar.SECOND, 0);
        calStart.set(Calendar.MILLISECOND, 0);
        // convert time from GMT to models TZ
        final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        sdf.setTimeZone(TimeZone.getTimeZone("GMT"));
        startTimeStr = sdf.format(calStart.getTime());
        startTimeStr += " " + model.getTimezone();
    }
    logger.info("Start time as string: " + startTimeStr);
    startTimeStr = addStartTime(startTimeStr);
    result = TimeUtil.parseDate(startTimeStr);
    logger.info("Start time: " + result);
    return result;
}

....
/**
* Add time to formated date string
* @param date "yyy/MM/dd z"
* @return
*/

public String addStartTime(final String date) {
    return date.replace("GMT", "00:00:00 GMT");
}

.....
/**
* Translate formated string to date
* @param dateStr formated string
* @return date in GMT
*/

public static Date parseDate(String dateStr) {
     Date result;
     try {
         String dateFormatStr;
         if (Pattern.matches(".*\\d\\d:\\d\\d:\\d\\d.*", dateStr)) {
            dateFormatStr = "yyyy-MM-dd HH:mm:ss";
         } else {
            if (Pattern.matches(".*\\d\\d:\\d\\d.*", dateStr)) {
                dateFormatStr = "yyyy-MM-dd HH:mm";
            } else {
                dateFormatStr = "yyyy-MM-dd";
            }
         }
         final DateFormat sdf = new SimpleDateFormat(dateFormatStr);
         if (dateStr.indexOf("GMT") != -1) {
            final String timeZoneStr = dateStr.substring(dateStr.trim()
                 .lastIndexOf(' '));
            sdf.setTimeZone(TimeZone.getTimeZone(timeZoneStr.trim()));
            dateStr = dateStr.replace(timeZoneStr, "");
         } else {
            sdf.setTimeZone(TimeZone.getTimeZone("GMT"));
         }
         result = sdf.parse(dateStr.trim());
     } catch (final Exception e) {
         return null;
     }
     return result;
}

Результат вполне не очевиден. Был даже юнит тест. Кроме того, по технологии копи+паст был сделан метод getEndTime().